Perl Slurp в Excel CSV-файл
Я анализирую файл Excel CSV в OSX El Capitan, CSV здесь
Проблема в том, что переводы строки помечены как \x0d (CR).
1] Я смог преобразовать файл с новыми строками, установленными как 'x0a' (NL) с
$> perl -e 'open(fh, "<coord2.csv") or die("can t open file");
binmode(fh); $/=\10;
while ($t=<fh>) { $t =~ s/\x0d/\x0a/g; print "$t"; } print "\n"; '
но до этого я попробовал два других пути, и они потерпели неудачу, я хотел бы знать, есть ли у вас некоторые объяснения по причине их неудачи.
2] Я пытался на время заморозить все файлы сразу:
$> cat coord2.csv | perl -e 'undef $/; $t=<>; print "$t \n"; '
но в выводе я не вижу весь файл, я вижу только:
Prelevacampioni ZARA;45.0640, 11.1943;F ;F 9.954467;F00;F599242;F
3] Я пытался также установить $/
переменная, с:
$> cat coord2.csv | perl -e '$/="\x0d"; @L=<>;
for (@L) { print $_; } print "\n"; '
но опять же, я вижу только тот же вывод, что и в пункте [2].
Я озадачен, можете ли вы объяснить мне, что я делаю неправильно в пунктах [2] и [3]?
1 ответ
Благодаря комментарию мне удалось понять это странное поведение в примерах [2] и [3]. Я пишу здесь решение для людей, которые могут в будущем иметь такую же проблему.
Дело в том, что OSX кодирует символы новой строки с помощью NL ='\n' = 'x0a', а в конце файла строки CVS кодируются с помощью CR = '\r' = 'x0d'. Perl правильно читал строки, но вывод был искажен, потому что CR сохранял запись Perl всегда на одной и той же строке.
Итак, исправленный код для примеров [2] и [3]:
[2] $> cat coord2.csv | perl -e 'undef $/; $t=<>;
$t =~ s/\x0d/\x0a/g; print "$t \n"; '
[3] $> cat coord2.csv | perl -e '$/="\x0d"; @L=<>;
for (@L) { s/\x0d/\x0a/g; print $_; } print "\n"; '