Замена строки в CSV-файле? - PullRequest
       12

Замена строки в CSV-файле?

1 голос
/ 20 января 2009

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

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

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

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

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

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

Ответы [ 7 ]

5 голосов
/ 20 января 2009

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

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

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

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

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

Оформить Освоение регулярных выражений .

2 голосов
/ 20 января 2009
sed 's/,,,/replacement/' < old-file.csv > new-file.csv

необязательно с последующим mv new-file.csv old-file.csv

1 голос
/ 20 января 2009

Проще всего:

$   grep -v ,,,, oldfile > newfile   
$   mv newfile oldfile
1 голос
/ 20 января 2009

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

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

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

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

1 голос
/ 20 января 2009

Вы хотите заменить их чем-то или полностью удалить? В любом случае это можно сделать с помощью 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,\}).

1 голос
/ 20 января 2009

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

awk '$0 !~ /,,,/ {print}' <old-file.csv > new-file.csv
0 голосов
/ 20 января 2009

да, awk или grep - очень хороший вариант, если вы работаете на платформе linux. Однако вы можете использовать Perl Regex для другой платформы. используя опции соединения и разделения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...