Как добавить двойную кавычку в CSV-файл, где поле содержит пробел? - PullRequest
0 голосов
/ 18 марта 2020

Одна функция унаследованного кода не работает, и я должен обойти ее, заново разработав быструю и грязную функцию.

Мы создаем CSV-файл, и у меня было что-то подобное с унаследованным кодом:

foo; bar;"foo bar";foobar
"bla ble"; bli;blo;"blu bly"

Каждое поле в моем csv, содержащее пробел, должно быть заключено в двойную кавычку "

В настоящее время, с моим быстрым и грязным скриптом, мой файл csv получил только

foo; bar;foo bar;foobar
bla ble; bli;blo;blu bly

Это нехорошо, потому что с моим быстрым и грязным скриптом у клиентов будут серьезные изменения: D

Я разрабатываю скрипт с использованием shell / bin / bash, я ищу arround sed или awk но не смог найти что-то, чтобы помочь мне.

Будете ли вы? :) Спасибо!

Ответы [ 4 ]

0 голосов
/ 19 марта 2020
echo "foo; bar;foo bar;foobar" | sed s'@;@+@'g | tr '+' '\n' | \
sed s'@^@\"@'g | sed s'@$@\";@'g | tr -d '\n'

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

Оттуда все просто. Сначала я заменяю начало каждой новой строки двойными кавычками, а затем конец закрывающими двойными кавычками и двоеточием.

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

0 голосов
/ 18 марта 2020

Вот простой awk:

$ awk 'BEGIN{FS=OFS=";"}{for(i=1;i<=NF;++i) if ($i ~ / /) $i = "\042" $i "\042"}1' file.csv
0 голосов
/ 19 марта 2020

Используя Миллера (https://github.com/johnkerl/miller) и запуская

mlr --icsvlite --ocsv --quote-all --fs ";" cat input

у вас будет

"foo";"bar";"foo bar";"foobar"
"bla ble";"bli";"blo";"blu bly"

Я думаю, для вас не проблема иметь двойные кавычки для всех

0 голосов
/ 18 марта 2020

Чтобы заключить в кавычки поля, содержащие пробелы (например, foo;foo bar -> foo;"foo bar"), вы можете использовать sed:

sed 's/ *\(\w\+ \)\+\w\+/"&"/g' input.csv > output.csv

Шаблон *\(\w\+ \+\)\+\w\+ соответствует нулю или более пробелов, после чего следует группа со словом и одним или несколькими пробелами \(\w\+ \+\), затем одно или несколько вхождений группы \+, за которыми следует слово \w\+. Замена "&" указывает на соответствующий шаблон.

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