2014-08-05 1 views
1

У меня много файлов csv, которые возникают из-за проблем с чтением, так как разделитель равен ',', а одно из полей - это список с разделителями-запятыми в квадратных скобках. В качестве примера:Заменить разделитель в csv, который не находится между квадратными скобками

first,last,list 
John,Doe,['foo','234','&3bar'] 
Johnny,Does,['foofo','abc234','d%9lk','other'] 

Я хотел бы изменить разделитель на '|' (или что-либо еще):

first|last|list 
John|Doe|['foo','234','&3bar'] 
Johnny|Does|['foofo','abc234','d%9lk','other'] 

Как это сделать? Я пытаюсь использовать sed прямо сейчас, но все, что работает, прекрасно.

ответ

2

Я не знаю, что это возможно с помощью sed или awk, но вы можете сделать это легко через perl.

$ perl -pe 's/\[.*?\](*SKIP)(*F)|,/|/g' file 
first|last|list 
John|Doe|['foo','234','&3bar'] 
Johnny|Does|['foofo','abc234','d%9lk','other'] 

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

perl -i -pe 's/\[.*?\](*SKIP)(*F)|,/|/g' file 
+0

спасибо, что работали, но и помогли мне понять, есть даже больше проблем с форматом моих исходных файлов>: X – MarkAWard

0

Если это всегда 2 значения перед списком, вы можете воспользоваться limit аргумента split в Perl:

perl -pe '$_ = join "|", split /,/, $_, 3' list 

Это расщепляется на запятые до максимального числа 3-х полей, то соединяет их вместе с трубой. Переключатель -p означает, что каждая строка ввода сохраняется как $_ и обрабатывается до этого, затем печатается $_.

Выход:

first|last|list 
John|Doe|['foo','234','&3bar'] 
Johnny|Does|['foofo','abc234','d%9lk','other'] 
Смежные вопросы