LINUX.ORG.RU

Дефолтный CSV-парсер по строчкам

В bash’е нет csv-парсера. Вот неожиданность-то.

Или брать что-то в духе csvkit, или же реализовать задачу не на bash.

Deleted ()
Ответ на: комментарий от letni

Или другой разделитель, который точно не будет использован в значениях :)

Deleted ()

Есть мысль, что существует некое подобие jq для csv.

IPR ★★★★★ ()
Ответ на: комментарий от vodz

Так допиши чтоб понимал.

И это, ты что, не видел цсв с переводами строк (разделитель рядов) внутри двойных кавычек? Ну так я видел — считается валидным, так же как и запятая (разделитель колонок).

deep-purple ★★★★★ ()
Ответ на: комментарий от vodz

на C

А вот это по нашему. Ссылку на репо дашь? Могу добавить поддержку утф-8 (без доп либ), если таковая отсутствует и у тебя только обычные чары.

deep-purple ★★★★★ ()
Ответ на: комментарий от deep-purple

Ссылку на репо дашь?

Трудно было догадаться поменять .sh на .c в том URL?

Могу добавить поддержку утф-8 (без доп либ), если таковая отсутствует

Для koi8/cp1251 -> utf8 там присутствует.

vodz ★★★★★ ()
Ответ на: комментарий от vodz

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

Ты что на фряхе сидишь (ну или тебя сакрихту с эдиком покусали)? Комментарии в файле в кои-8.

Я про чтение утф-8 — нету. Ну и раз уж я открыл сорцы, зачем маллочишь так много, а если файл паругиговый?

deep-purple ★★★★★ ()
Ответ на: комментарий от RazrFalcon

Просто используйте питон

Плюсую. Это задача, для которой bash - не лучший выбор

а не богомерзкий баш.

Минусую

Kroz ★★★★★ ()

Очевидно он парсит корректно. По спекам надо эскейпить разделитель.

Deleted ()
$ cat delme.txt
foo,"bar,baz"
"foo,bar",baz

$ cat delme.txt | while read L; do echo "$L" | perl -pe 's/"([^"]*+)"[,\n]?|([^",\n]+)[,\n]?/<$1$2>/g' ; echo ; done
<foo><bar,baz>
<foo,bar><baz>


Немного переработанное решение arsi.

Kroz ★★★★★ ()
Ответ на: комментарий от vodz

Трудно было догадаться поменять .sh на .c в том URL?

Страшно, вырубай. Нет чтобы на нормальных языках писать...

RazrFalcon ★★★★★ ()
Ответ на: комментарий от deep-purple

Я про чтение утф-8 — нету.

Да читайте наздоровье, получите на выходе ваш любимый он же. Какие проблемы то? Для этого оно и таким богомерзким и придумано.

vodz ★★★★★ ()
Ответ на: комментарий от deep-purple

зачем маллочишь так много, а если файл паругиговый?

Так много — это как? У меня стояла задача не тупо, а с фильтром обработать, потому для пересортировки столбцов надо вначале строку всю и поместить в память. После вывода строки (если полностью не отфильтровалось) память освобождается. Если у вас одна строка гиговая, то как потом вы это смотреть будете?

vodz ★★★★★ ()
Ответ на: комментарий от vodz

Бегло смотрел. Если после каждой строки освобождает то гут.

deep-purple ★★★★★ ()
Ответ на: комментарий от Moondancer

Ну ты выдал — парсер должен знать какого размера символ в байтах, чтобы не пропарсить 1/2, 1/3, 1/4, 1/5 или 1/6 символа как целый один.

deep-purple ★★★★★ ()
Ответ на: комментарий от Deleted

Kroz best.

Ну мало того, что тут bash только запускалка, так ещё править и править для вполне валидных csv:

$ cat delme.txt 
bar,
"bar,""baz""",foo
и т. д.

vodz ★★★★★ ()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от deep-purple

Вотъ, а как раз в случае с UTF-8 нужна плотная интеграция с опознавателем кодировки, потому что число байт в нём всегда переменно.

Moondancer ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.