@bratok191

Как удалить символ разделителя из значений?

Есть большой файл CSV (100-1000 мб).
Разделитель: точка с запятой.
Открывать файл через libreoffice очень долго...
Пробовал через Emeditor, устанавливал разделитель: точка с запятой, но дальше если делаю замену, то оно удаляет все ; (в том числе и разделители).
Можно удалить точку с запятой только в самом тексте (т.к. точка с запятой тоже встречается много в каких ячейках), но чтобы структура таблицы осталась прежней?
  • Вопрос задан
  • 429 просмотров
Решения вопроса 1
@d-stream
Готовые решения - не подаю, но...
Можно тупо экспортировать с разделителем "табуляция", потом поиском и заменой заменять потенциальный разделитель на что-то альтернативное и потом менять табуляцию на этот разделитель. Вероятность нахождения в поле символа табуляции - околонулевая.
Чуть проще - в utf8 менять табуляцию на какой-нибудь "редкий" символ (например в диапазоне U+F0000...U+FFFFF
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
firedragon
@firedragon
Не джун-мидл-сеньор, а трус-балбес-бывалый.
Примерно так

$ cat tt.csv
one;two;three
one;"hi; there";three
"123 main st.; Apt 22";"New York; NY";90023
$
$ awk -F'"' -v OFS='' '{ for (i=2; i<=NF; i+=2) gsub(";", "", $i) } 1' tt.csv
one;two;three
one;hi there;three
123 main st. Apt 22;New York NY;90023
$


PS ребят что выше отписались. Вы что реально не слышали про awk sed grep ?
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Люди разные в хабр приходят. И я сходу не могу понять уровень вашей подготовки. И от этого
сильно зависит то какие советы вам давать. Вроде-бы у вас в вопросах мелькает MYSQL, тоесть
вы по крайней мере вкурсе что это и SQL-запрос вас не испугает. Тут есть два варианта.

1) Попробуйте загрузить этот CSV файл в MYSQL и далее командами UPDATE поубирать лишние символы
в полях и потом обратно сохранить в CSV файл. Для этого есть коробочные технологии. Тут описано
https://dev.mysql.com/doc/refman/8.1/en/mysqlimpor...

2) Если за день-два не получится - то ищите программиста.
Ответ написан
Комментировать
@odissey_nemo
Программист, ГИС-системы, растры, космоснимки
Стало быть, в этом CSV есть поля, ограниченные, например, через двойной апостроф ("), как раз для случаев, когда разделитель попадается внутри поля. А разделители полей в вашем файле CSV - точка с запятой (;). И надо внутри полей удалить все (;) являющиеся частью данных, но не разделителями.
В принципе, задача достаточно рутинная и часто встречаемая.
Т.к. работаю иногда с CSV, то за годы накопился кое-какой инструментарий для этого. В частности, своя библиотека на Java. Иногда пользую и сторонние библиотеки, например Apache Common CSV . Все такие библиотеки, не только на Java, содержат функциональность считывания CSV по одной cтроке и записывания по одной строке в другой CSV.
Т.е. нет никаких трудностей написать программу на Java в 5-10 строк, которая по очереди считывает каждую строку CSV, из каждого поля удаляет (;) и записывает новую строку с теми же разделителями и ограничителями полей (;) и ("). В итоге получится файл, выглядящий как исходный, за исключением символа (;) в данных. Этот способ сработает быстрее всех прочих на порядки, а по памяти он кушает и на 3-4 порядка меньше.
Есть и специальные быстрые редакторы, заточенные именно на CSV. Пользовал такой. Скорее всего , он сможет открыть ваш файл, достаточно быстро выполнить операцию и сохранить результат. Хотя придётся слегка его поизучать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы