Как разобрать файл с несколькими значениями, разделенными запятыми

У меня есть файл с разделителями-запятыми, в котором есть 6 полей, тогда как мы получили запятую как значение поля, и оно заключено в "". Мне нужно заменить эту запятую на hiphen.

Введите как

03/03/2016,Customer Service,CHAT,"Responded, closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded, awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31

И ожидаемый результат как

03/03/2016,Customer Service,CHAT,"Responded- closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded- awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31

person Rajini Rajas    schedule 08.03.2016    source источник
comment
Используйте язык с подходящим парсером CSV. Большинство инструментов оболочки работают с регулярными выражениями, которых недостаточно для распознавания действительного файла CSV.   -  person chepner    schedule 08.03.2016


Ответы (1)


Используя FPAT в gnu-awk, вы можете сделать это:

awk -v FPAT='"[^"]+"|[^,]+' -v OFS=, '{for(i=1; i<=NF; i++) gsub(/,/, "-", $i)} 1' file.csv
03/03/2016,Customer Service,CHAT,"Responded- closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded- awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31

Используя sed, вы можете сделать это:

sed -E ':a; s/("[^,"]+),([^"]*")/\1-\2/g; ta;' file.csv
03/03/2016,Customer Service,CHAT,"Responded- closed",True,59
02/24/2016,Customer Service,CALL,Responded,True,55
03/03/2016,Customer Service,CHAT,"Responded- awaiting reply",False,46
02/24/2016,Customer Service,CALL,Responded,False,51
02/24/2016,Customer Service,CHAT,Responded,False,31
person anubhava    schedule 08.03.2016
comment
++ за красивое решение AWK - person MaxU; 08.03.2016
comment
Поскольку я не использую gnu-awk, команда возвращает вывод, как показано ниже $ awk -v FPAT = '[^] + | [^,] +' -v OFS =, '{for (i = 1; i ‹= NF; i ++) gsub (/, /, -, $ i)} 1 'file.csv 03/03/2016-Customer, Service-CHAT-Responded-, closed-True-59 24.02.2016-Клиент, Сервис -CALL-Responded-True-55 03.03.2016-Клиент, служба-ЧАТ-ответила-, ожидает, ответ-Ложь-46 24.02.2016-Заказчик, Служба-CALL-Responded-False-51 02/24 / 2016-Клиент, Служба-ЧАТ-Ответил-Ложь-31 - person Rajini Rajas; 08.03.2016
comment
FPAT поддерживается только в gnu-awk, поэтому он не будет работать в более старых версиях awk. Попробуйте мою предложенную команду sed - person anubhava; 08.03.2016
comment
gawk -v FPAT = '[^] + | [^,] +' -v OFS =, '{для (i = 1; i ‹= NF; i ++) gsub (/, /, -, $ i)} 1 'file.csv дает тот же результат, а sed у меня вообще не работает. sed -E ': a; s / ([^,] +), ([^] *) / \ 1- \ 2 / g; та; ' file.csv sed: недопустимый параметр - E - person Rajini Rajas; 08.03.2016
comment
У меня эта же команда не работает. Не могли бы вы помочь мне в этом - person Rajini Rajas; 08.03.2016
comment
Я уже помог, чем смог. Если команда работает в моей системе, а также в демонстрации Ideone, проблема в вашей более старой версии awk. Я также предоставил альтернативную рабочую команду sed, и вы также можете попробовать ideone, и она будет работать. - person anubhava; 08.03.2016
comment
Спасибо, анубхава. Очень признателен. Я пытаюсь это исправить - person Rajini Rajas; 08.03.2016
comment
Это не будет обрабатывать поля, содержащие двойные кавычки. RFC 4180 позволяет избежать двойной кавычки, удвоив ее: field1, "field ""2"" with 2 in quotes", "field 3". - person chepner; 08.03.2016
comment
Ни в коем случае это полнофункциональный парсер CSV. Это нацелено на образцы данных, представленные в OP. - person anubhava; 08.03.2016
comment
В ksh можно разбирать csv, включая кавычки. Не рекомендую. - person Henk Langeveld; 09.03.2016
comment
Да, полноценный синтаксический анализатор CVS не может быть построен с использованием только утилит оболочки. Более сильные языки, такие как PHP, Perl, Python, Ruby и т. Д. Лучше - person anubhava; 09.03.2016