Как заменить или прокомментировать двойные кавычки в CSV-файле, когда двойным кавычкам предшествует число - PullRequest
0 голосов
/ 08 сентября 2018

Ubuntu 16.04
GNU bash, версия 4.3.48

У меня есть некоторые CSV-файлы, которые не анализируются должным образом из-за "", которые размещены внутри полей для представления дюймов.

В нашем файле csv столбцы с несколькими значениями должны быть разделены запятыми, а затем столбец должен быть заключен в двойные кавычки, например:
"one","two","three, three, three, three","four","five"

Пример иностранца ""

... star","Radio data system,Radio: AM/FM 8"" Diagonal Color Touch Screen,Single Slot CD/MP3 Player, Nicer","Siera ...
... star","Rear Wheelhouse Liners,Thin Profile LED Fog Lamps,4.2"" Diagonal Color Display Driver Info Center,Chevrolet Connected Access","Chevrolet ...

Я знаю, что могу использовать sed для замены "" кавычек, например sed -i 's/""/inch/g' filename.csv

Но это вызывает проблемы, когда столбец не содержит информации, например:

... star","Program. Exp. 10/01/2018","","All Star Edition,LT Plus Package, somemore ...","Felix ...

Поэтому я ищу способ заменить двойные кавычки, когда им предшествует число.

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Вы не должны (и не должны!) Заменять или удалять эти встроенные кавычки.Вторая кавычка предназначена для того, чтобы избежать двойной кавычки внутри вашего поля.

Возьмем ваш первый пример:

"one","two","three, three, three, three","four","five"

Скажем, мы хотим вставить "test" в третье поле, включая эти кавычки:

"one","two","three, "test", three, three, three","four","five"

Это будет проблемой для парсера.Поэтому эти кавычки должны быть экранированы другой кавычкой:

"one","two","three, ""test"", three, three, three","four","five"

Подробнее о формате см. rfc4180 .

Итак, в вашем CSV-файле данные верны(кавычки правильно экранированы):

,"Radio data system,Radio: AM/FM 8"" Diagonal",

Все, что вам нужно сделать, это сообщить парсеру, что поля заключены в кавычки, и (необязательно) встроенные кавычки экранированы с другой кавычкой (некоторые системы используют \ дляизбегайте этих кавычек).

Удаление или замена этих пар кавычек перед синтаксическим анализом может привести к всевозможным проблемам и ошибкам.

0 голосов
/ 08 сентября 2018

Сделайте так:

line1='... star","Radio data system,Radio: AM/FM 8"" Diagonal Color Touch Screen,Single Slot CD/MP3 Player, Nicer","Siera ...'
line2='... star","Rear Wheelhouse Liners,Thin Profile LED Fog Lamps,4.2"" Diagonal Color Display Driver Info Center,Chevrolet Connected Access","Chevrolet ...'
line3='... star","Program. Exp. 10/01/2018","","All Star Edition,LT Plus Package, somemore ...","Felix ...'

echo $line1 | sed 's/\([0-9]\)""/\1inch/g'
echo $line2 | sed 's/\([0-9]\)""/\1inch/g'
echo $line3 | sed 's/\([0-9]\)""/\1inch/g'
  • \([0-9]\): любое число от 0 до 9. Здесь есть скобки, так как нам нужно сохранить номер в замене.
  • \1inch: \ 1 заменяется числом, которое мы сохранили в соответствующей части, «дюйм», что очевидно; -)
  • Не уверен, если вы хотите сохранить один ", это было бы сделано с одной простой модификацией: echo $line3 | sed 's/\([0-9]\)""/\1inch"/g'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...