Формат валюты изменения к универсальному числу с помощью sed

Использовать mod_deflate.

Добавьте это к своей апачской конфигурации:

LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so

    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css

Очевидно, если путь, Ваше системное использование для апачских модулей отличается затем, необходимо будет использовать корректный путь.

2
10.10.2012, 03:33
4 ответа

просто выразить то, что должно быть сделано:

1 Для каждой строки, между которой включают "$ и " удалите все ,
2 удаляют окружение "$ и "

Это - sed выражения. При использовании его на полотне команды, необходимо заключить его в кавычки соответственно. Более просто поместить его в файл, например, command.sed, и назвать его

sed -f command.sed data.csv

Это - программа, которая реализует эти два шага:

:repeat
s/"\$\([^,"]*\),/"$\1/g 
t repeat
s/"\$\([^"]*\)"/\1/g 

Этот документ помог мне решить проблему.

1
27.01.2020, 22:14

Обновление: адаптация ответа от Замены располагает с интервалами только промежуточные кавычки для решения этой проблемы.

Команда:

echo '123,7,11,"$343,700.14","$34,928.63","$377,000.00","$15,421.92",19,2' |
awk -F\" '{OFS="\""; for (i = 2; i < NF; i += 2) gsub(/[$,]/,"",$i); gsub(/"/,""); print}'

Вывод:

123,7,11,343700.14,34928.63,377000.00,15421.92,19,2

Первое gsub удаляет $s и ,s в двойных кавычках. Вторые удаляют сами кавычки.

Отъезд исходного ответа ниже в случае, если это помогает.

Если бы я понимаю Вас правильно, простой поиск и замена сделали бы это

echo '"$1,234,567.89"' | sed 's/[$,"]//g'

Вывод 1234567.89.

То, что это делает, - то, что это занимает место (s) символы, соответствующие ([]) $, , и " ни с чем (пустой между последними двумя /. g флаг заставляет его применяться глобально, заменяя все экземпляры (в других отношениях только первая инстанция в строке была бы заменена).

Как подать заявку, это в целый файл зависит от формата файла. Если нет ничего иного в файле, который имеет двойные кавычки, знаки доллара и запятую, это должно быть хорошо:

sed 's/[$,"]//g' /path/to/file
1
27.01.2020, 22:14
  • 1
    Спасибо @phunehehe. Это выглядит достаточно близким, за исключением того, что это также уничтожило бы все другие комы, разделяющие записи в файле.Я прав? –  Ali 10.10.2012, 03:29
  • 2
    Право. Мое небольшое исследование предлагает, чтобы Вам было нужно awk, но мой awk не хорошо :) Вот подсказка в правильном cpan использования направления stackoverflow.com/q/5499798/168034 –  phunehehe 10.10.2012, 04:08
  • 3
    1 сценарий не решает проблему –  miracle173 10.10.2012, 04:51

Немного замысловатое awk решение, на основе парсинга CSV с awk

{
$0=$0",";                                  # yes, cheating
while($0) {
  gsub(/\$/,"",$0)
  match($0,/ *"[^"]*" *,|[^,]*,/);
  sf=f=substr($0,RSTART,RLENGTH);          # save what matched in sf
  gsub(/^ *"?|"? *,$/,"",f);               # remove extra stuff
  gsub(/,/,"",f);
  if($0 ~ /,[^,]+,$/){
    printf "%s,",f;
  }else{
    printf "%s",f;
  }
  sub(sf,"");                              # "consume" what matched
}
printf "\n"
}

Сохраненное вышеупомянутое как csv.awk и работало как так:

echo '123,7,11,"$343,700.14","$34,928.63","$377,000.00","$15,421.92",19,2'|awk -f csv.awk
123,7,11,343700.14,34928.63,377000.00,15421.92,19,2
0
27.01.2020, 22:14
  • 1
    Спасибо @tink. Я пытался запустить Ваш скрипт на файле, но это становится слишком длинным для завершения. Команда, которую я выполнил, была cat data.csv | awk -f csv.awk > updated.csv. Я думаю что-то в сценарии (или команда, которую я выполнил), не оптимизирован с этой целью. Используя calc openoffice, я смог к той же задаче через несколько минут на том же файле. Мое впечатление - это awk может сделать намного быстрее на этом задании, чем calc, гул?! –  Ali 10.10.2012, 06:23
  • 2
    спасибо Трудно для высказывания, что могло бы продолжаться там. Все данные на самом деле формируются как одна строка, которую Вы вставили выше? Если существуют отклонения в разделителях или встроенные специальные символы, которые могли бы быть интерпретированы, поскольку часть RegEx awk могла бы быть отброшена. –  tink 10.10.2012, 06:33

То, как это значение валюты отображено, зависит от Вашего средства просмотра CSV, почему Вы не изменили бы "представление", например, в Excel вместо того, чтобы изменить это поле?

YAnyway, у Вас могло бы быть несколько полей в Вашем csv поле, таким образом, будет более безопасно использовать сценарий обработчика как это:

#!/usr/bin/perl

use strict;
use warnings;
use Text::CSV;

my $csv = Text::CSV->new ( { binary => 1 } );
while ( my $row = $csv->getline(\*STDIN) ) {
    foreach my $item (@$row)
    {
        $item =~ s/,//g if ($item =~ /^\$[0-9,.]+$/);
    }
    $csv->print (\*STDOUT, $row);
    print "\n";
}

Использование:./csv.pl <in.csv> ou.csv

Вход:

abc,"$1,243,311.99",def
abc2,"$43,311.99",def2

Вывод:

abc,$1243311.99,def
abc2,$43311.99,def2
0
27.01.2020, 22:14
  • 1
    Спасибо @warl0ck. Я получаю следующую ошибку: Can't locate Text/CSV.pm in @INC. Кажется, что я имею некоторых пропавших без вести библиотеки жемчуга, но к сожалению не имею полномочия установить любой модуль на машине, которую я в настоящее время выполняю. Вы знаете о каком-либо способе обойти эту ошибку? –  Ali 10.10.2012, 03:59
  • 2
    @Ali затем, cpan install Text::CSV –  daisy 10.10.2012, 04:12
  • 3
    кажется, что у меня нет разрешения установить дополнительные библиотеки по этому компьютеру. Я попытаюсь установить его на моей собственной машине позже сегодня и видеть, могу ли я разработать его. :) –  Ali 10.10.2012, 06:25
  • 4
    @Ali cpan, установит модуль intto домашняя папка –  daisy 10.10.2012, 07:20

Теги

Похожие вопросы