2009-01-19 9 views
1

У меня есть набор из 10 CSV файлов, которые обычно имеют запись такого родаЗамена строки в файле csv?

a,b,c,d 
d,e,f,g 

Теперь из-за некоторые записи об ошибках в этом файле стали такого рода

a,b,c,d 
d,e,f,g 
,,, 
h,i,j,k 

Теперь я хотите удалить строку только с запятыми во всех файлах. Эти файлы находятся в файловой системе Linux.

Любая команда, которую вы рекомендуете, может заменить ошибочные строки во всех файлах.

ответ

5

Это зависит от того, что вы подразумеваете под заменой. Если вы имеете в виду «удалить», то тривиальный вариант на @ wnoise, решение которого является:

grep -v '^,,,$' old-file.csv > new-file.csv 

Обратите внимание, что это удаляет только те строки, с ровно три запятые. Если вы хотите удалить Mal сформированных строк с любым количеством запятых (включая ноль) - и никаких других символов на линии, то:

grep -v '^,*$' ... 

Есть бесконечные другие вариации на регулярных выражениях, которые будут иметь дело с другими сценариями , Работа с полными CSV-данными с запятыми внутри кавычек начинает нуждаться в чем-то отличном от машины регулярных выражений. Это можно сделать в широких пределах, особенно в более сложных системах регулярных выражений, таких как PCRE или Perl. Но это требует больше работы.

Отъезд Mastering Regular Expressions.

2
sed 's/,,,/replacement/' < old-file.csv > new-file.csv 

необязательно с последующим мв нового FILE.CSV старого FILE.CSV

+0

O.M.G! Убей это старое! Это заставляет меня чувствовать себя ooolllldddd. :-) –

+0

не удаляет линию ... см. Дэвид для лучшего использования sed – orip

+0

Он попросил заменить, а не удалить, когда я ответил. – wnoise

1

Заменить или удалить, ваше сообщение не понятно ... Для замены см ответ wnoise в. Если вы хотите, то можете использовать

awk '$0 !~ /,,,/ {print}' <old-file.csv > new-file.csv 
1

Вы хотите заменить их чем-нибудь или полностью удалить их? В любом случае, это можно сделать с помощью sed. Для удаления:

sed -i -e '/^,\+$/ D' yourfile1.csv yourfile2.csv ... 

Для замены: ну, видите ответ wnoise, либо, если вы не хотите, чтобы создать новые файлы с выходом,

sed -i -e '/^,\+$/ s//replacement/' yourfile1.csv yourfile2.csv ... 

или

sed -i -e '/^,\+$/ c\ 
replacement' yourfile1.csv yourfile2.csv ... 

(который должен вводиться точно так же, как есть, включая разрыв строки). Конечно, вы также можете сделать это с awk или perl или, если вы только удалить линии, даже grep:

egrep -v '^,+$' <oldfile.csv> newfile.csv 

Я проверил их, чтобы убедиться, что они работают, но я бы посоветовал вам сделать то же самое, прежде чем использовать их (на всякий случай). Вы можете опустить параметр -i от sed, и в этом случае он распечатает результаты (вместо того, чтобы записывать их обратно в файл), или опустите перенаправление вывода >newfile.csv от grep.

EDIT: Было отмечено в комментарии, что некоторые особенности этих sed команд работают только на GNU sed. Насколько я могу судить, это опция -i (которая может быть заменена перенаправлением оболочки, sed ... <infile >outfile) и модификатором \+ (который может быть заменен на \{1,\}).

+0

nice - 'sed -i' rocks – orip

+0

Некоторые из ваших опций sed не являются переносимыми (особенно для GNU sed). Не большая проблема, если вы знаете об этом. –

+0

@Johnathan: true, я использую только GNU sed, и я, как правило, забываю о его расширениях, если только я не смотрю на информационную страницу. Благодарю. –

1

Как насчет того, чтобы сохранить только линии, соответствующие желаемому формату, вместо обработки одного исключения?

Если прилагаемая вход то, что вы действительно хотите, чтобы соответствовать:

grep -E '[a-z],[a-z],[a-z],[a-z]' <oldfile.csv> newfile.csv 

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

1

Наиболее просто:

$ grep -v ,,,, oldfile > newfile 
$ mv newfile oldfile 
+0

Только 3 запятые в шаблоне для удаления. : D –

0

да, AWK или Grep очень хороший вариант, если вы работаете в Linux платформы. Однако вы можете использовать регулярное выражение perl для другой платформы. используя соединение &.

+0

Зачем расколоться и присоединиться? Да, вы, безусловно, можете использовать perl. Но основной цикл будет использовать регулярное выражение, чтобы соответствовать или не соответствовать строкам, которые нужно распечатать, - я не вижу операцию join/split. Даже замена вместо удаления, вероятно, не будет использовать объединение или разделение. –

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