2017-01-03 2 views
-1

Я пытаюсь разбить файл на «,». Это файл CSV.Perl - «/», вызывающие проблемы для разделения по запятой

Однако один «столбец» имеет значения, которые включают «/» и пробелы. И, похоже, он волнуется с этим столбцом и ничего не печатает после этого столбца, но переходит к следующей строке.

Мой код просто:

perl -lane '@values = split(",",$F[0]); print $values[0]."\t".$values[3];' basefile.txt > newfile.txt 

basefile.txt выглядит следующим образом:

"1","text","abc // 123 /// some more text // text","filename1" 
"2","text","abc // 123 /// some more text // text","filename2" 
"3","text","abc // 123 /// some more text // text","filename3" 

Мой newfile.txt должен иметь выход:

"1","filename1" 
"2","filename2" 
"3","filename3" 

Вместо этого я получаю :

"1", 
"2", 
"3", 

Спасибо!

+1

Почему Вы используете * AutoSplit * '-a' флага? Таким образом, '$ F [0]' будет содержать только часть записи до первого пробела или вкладки. Вы должны * узнать, что делает каждый флаг командной строки, а не слепо использовать заклинания, которые «работали до». – Borodin

ответ

5

Это не /, который путает perl здесь, это пробелы, объединенные с флагом -a. Попробуйте: еще

perl -lne '@values = split(",",$_); print $values[0]."\t".$values[3]' basefile 

Или, лучше использовать Text::CSV_XS делать расщепление.

+2

В качестве альтернативы укажите '-F,' и используйте '@ F' вместо' @ values'. – melpomene

+4

Re "* use Text :: CSV_XS, чтобы сделать расщепление *", это единственный действительный ответ. Очевидно, что в OP явно указано CSV (например, '1," foo, bar ", ..'), что 'split' (или' -a') испортит – ikegami

3

Это не «/», это пробелы.

Флаг -a вызывает perl, чтобы разделить каждую строку ввода и поместить поля в переменную @F. Разделитель для этой операции разделения - это пробел, если вы не переопределите его с помощью опции -Fdelimiter в командной строке.

Таким образом, для ввода

"1","text","abc // 123 /// some more text // text","filename" 

-lan с флагами указанных, Perl устанавливает

$F[0] = '"1","text","abc'; 
$F[1] = '//'; 
$F[2] = '123'; 
$F[3] = '///'; 
$F[4] = 'some'; 
etc. 

Похоже, вы просто хотите сделать свой раскол операцию на всей линии. В этом случае следует прекратить использование -a флага и просто сказать

@values = split(",",$_); ... 

или использовать в -a и -F... варианты и сказать

perl -F/,/ -lane '@[email protected]; ...' 
+0

Это не работает. вход - многострочный файл, то есть «1», «текст», «abc // 123 /// еще текст // текст», «имя файла» \ n "1", "текст", "abc// 123 /// some more text // text "," filename "\ n" 1 "," text "," abc // 123 /// some more text // text "," filename " – yondaimehokage

+0

@yondaimehokage Это довольно трудно прочитать это в комментарии, поэтому вы должны отредактировать его в своем вопросе. – ThisSuitIsBlackNot

+1

Кроме того, «не работает» редко является полезным диагностическим сообщением. Вместо этого вы должны сообщить нам, что произошло, включая сообщения об ошибках, и объяснить, как он отличается от того, что вы ожидали. – mob

Смежные вопросы