Использовать mod_deflate
.
Добавьте это к своей апачской конфигурации:
LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
Очевидно, если путь, Ваше системное использование для апачских модулей отличается затем, необходимо будет использовать корректный путь.
просто выразить то, что должно быть сделано:
1 Для каждой строки, между которой включают "$
и "
удалите все ,
2 удаляют окружение "$
и "
Это - sed выражения. При использовании его на полотне команды, необходимо заключить его в кавычки соответственно. Более просто поместить его в файл, например, command.sed, и назвать его
sed -f command.sed data.csv
Это - программа, которая реализует эти два шага:
:repeat
s/"\$\([^,"]*\),/"$\1/g
t repeat
s/"\$\([^"]*\)"/\1/g
Этот документ помог мне решить проблему.
Обновление: адаптация ответа от Замены располагает с интервалами только промежуточные кавычки для решения этой проблемы.
Команда:
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
awk
, но мой awk
не хорошо :) Вот подсказка в правильном cpan использования направления stackoverflow.com/q/5499798/168034
– phunehehe
10.10.2012, 04:08
Немного замысловатое 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
cat data.csv | awk -f csv.awk > updated.csv
. Я думаю что-то в сценарии (или команда, которую я выполнил), не оптимизирован с этой целью. Используя calc openoffice, я смог к той же задаче через несколько минут на том же файле. Мое впечатление - это awk
может сделать намного быстрее на этом задании, чем calc, гул?!
– Ali
10.10.2012, 06:23
То, как это значение валюты отображено, зависит от Вашего средства просмотра 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
Can't locate Text/CSV.pm in @INC
. Кажется, что я имею некоторых пропавших без вести библиотеки жемчуга, но к сожалению не имею полномочия установить любой модуль на машине, которую я в настоящее время выполняю. Вы знаете о каком-либо способе обойти эту ошибку?
– Ali
10.10.2012, 03:59