LINUX.ORG.RU

операции над текстом с конкретным «столбцом» в csv файле

 , ,


0

2

Есть .csv файл, разделитель «;» в котором только в одном из «столбцов» необходимо удалить пробелы/заменить несколько пробелов на один. а другие столбцы не трогать.

Вопрос в том, в принципе при потоковой обработке файла sed-ом (там попутно ещё много чего в файле правится), как это можно наиболее просто сделать в конкретно взятой колонке этого .csv ? Может есть какой-то простой механизм, который можно реализовать в «однострочнике»?


Для CSV существует масса специализированных утилит, включая утилиты, позволяющие работать с CSV файлами используя SQL.

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

IMHO, гораздо надежнее и лучше установить одну зависимость или взять тот же Python со встроенным модулем CSV (и ещё кучей батареек с PyPI, позволяющих более продвинутые манипуляции), чем устраивать подверженный ошибкам закат солнца вручную с помощью низкоуровневых инструментов.

Только если рассматривать это как гимнастику для ума, когда есть вагон свободного времени.

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

Python имеет смысл взять, конечно, но это может быть оверкилл. Смотря что нужно. awk прекрасно работает с csv. С задачей выше он вполне справится:

awk -F ';' '{OFS=FS; gsub("  "," ",$3); print}'

($3 порядковый номер колонки).

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

P.S. Подсветка синтаксиса для Bash на ЛОРе почему-то едет, если нет пробела после -F

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 5)
Ответ на: комментарий от firkax

Нуу на самом деле идея вполне имеет право на жизнь, в SQLite загрузка/выгрузка CSV делается в 1 клик, такой инструмент в запасе иметь, помимо sed/awk вполне полезно

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

С точки зрения кодинга - да, очень просто всё получается, а вот с точки зрения того, чем проц будет заниматься? Он сначала будет полноценно парсить всю таблицу, затем делать (в памяти? не суть) запрос, потом обратно конвертировать всё в csv. Потоковое редактирование выглядит явно быстрее, если фичи реляционной бд не нужны.

firkax ★★★★★
()

Короче, сделал на awk в несколько строк скриптец, для решения этой задачи. Ввиду того, что я «программирую» крайне редко, предполагал, что возможно есть какой-нибудь совсем простой метод в одну команду, о существовании которой я не знал :)

karasic
() автор топика
Ответ на: комментарий от firkax

Имеет ещё значение простота отладки и последующей поддержки. Можно нахреначить баш-портянок с грепами и седами, в которых через год никто уже не будет ничего понимать, и будет невозможно что-либо легко исправить.

С таким тоже сталкивался, и относительно недавно.

Кроме того, если CSV небольшой, а компы сейчас мощные - что плохого в том, чтобы использовать почти всем понятный язык, который, к тому же, будет оперировать не символами-байтами, а семантическим пониманием того, что у нас строки со столбцами?..

emorozov
()
Ответ на: комментарий от firkax

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

Прикрутить к SQL-синтаксису оптимизацию для простого UPDATE/SELECT без группировок и соединений проще, чем через sed/awk заставить адекватно разбирать

1;"a;b";"c";"d"
2;"f";"g;""g1";"h"
monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 2)
Ответ на: комментарий от theNamelessOne

В этом случае и со всякими специальными либами не всё так просто. В общем случае предполагается, что разделителя внутри столбцов нет. Иногда поддерживаются кавычки (и сами по себе тогда игнорируются). Иногда кавычки обязательны. Иногда поддерживается экранирование символа-разделителя. Об этом всё равно придётся позаботиться, что так что эдак.

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

Короче, сделал на awk в несколько строк скриптец, для решения этой задачи. Ввиду того, что я «программирую» крайне редко, предполагал, что возможно есть какой-нибудь совсем простой метод в одну команду, о существовании которой я не знал :)

Я же выше дал метод в одну команду. Понятно, что может требоваться что-то ещё, помимо озвученного. Но когда всё не так просто, то и скрипт будет не так прост.

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

Можно нахреначить баш-портянок с грепами и седами, в которых через год никто уже не будет ничего понимать

А можно написать awk-скрипт, который будет предельно понятен и весьма эффективен :)

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

Здесь уже не CSV по стандарту, потому что в качестве разделителя не ,, а ;. Одно дело, что «надо», и совсем другое, в каком виде данные реально хранятся/пришли (что не всегда от тебя зависит).

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

В RFC же написано. Если поле в кавычках, то их всегда отбрасывать. Если в начале поля кавычки нет, значит не в кавычках.

Если строка начинается с кавычки, то её целиком надо взять в кавычки, а кавычку как спецсимвол удвоить.

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

Тут есть несколько вариантов

  1. У ТСа разделитель не запятая, так что вполне возможно, что у него не полноценный CSV, а его его подмножество без траха с кавычками
  2. Можно заинклудить указанную либу или использовать тот же goawk

В обоих случаях скрипт с бизнес-логикой должен получиться простым

annulen ★★★★★
()
Последнее исправление: annulen (всего исправлений: 2)
Ответ на: комментарий от monk

В RFC же написано.

Там может быть написано всё, что угодно. В том числе и то, что разделителем является запятая, а не точка с запятой. В реальности же обычно приходится работать с данными, соответствие которых этому RFC распределено случайно.

CrX ★★★★★
()

Есть .csv файл, разделитель «;» в котором только в одном из «столбцов» необходимо удалить пробелы/заменить несколько пробелов на один. а другие столбцы не трогать.

для развлечения можно сделать c cut,paste,tr; но лучше действительно на awk

MKuznetsov ★★★★★
()