Проблемы с правильным форматированием данных CSV

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

Справочная информация: я пытаюсь правильно отформатировать очень большой CSV-файл, чтобы импортировать его в таблицу в моей базе данных PostgreSQL. Этот файл CSV содержит только два поля и разделитель ;

Возникшие проблемы/попытки решения

Проблема №1: разделителем является точка с запятой, и многие значения в одном из полей содержат точку с запятой. PostgreSQL это явно не нравится.

Решение № 1. Я использовал sed, чтобы изменить разделитель на строку символов, которая, как я знал, будет использоваться только как разделитель.

Проблема № 2: разделитель может быть только одним символом.

Решение № 2. Я изменил разделитель на символ Юникода, который, как я знал, не будет встречаться ни в каком другом виде, кроме разделителя.

Проблема №3: ​​разделитель может быть только однобайтовым символом.

Решение № 3. Я решил вернуться к своим шагам и вместо того, чтобы возиться с разделителем, попытался использовать sed для заключения всех значений полей в двойные кавычки, чтобы избежать проблемы с некоторыми значениями, содержащими символ-разделитель. В частности, я попытался использовать команду, найденную в ответе на этот вопрос, - оператор sed для изменения/изменения разделителей и разделителей CSV

Проблема № 4. Это приводило к множеству ошибок данных, поскольку каждый раз, когда в одном из значений был разделитель, его окружали двойными кавычками, и это заставляло Postgre SQL пытаться копировать значения, которые были слишком длинными и просто не были отдельными. ценности. Этот ряд здесь является прекрасным примером этого -

    "m[redacted]@[redacted].com";"mk,l.";"/'"

Эта строка, в частности, заставила PostgreSQL подумать, что он копирует 3 столбца. Не говоря уже об этом ряду -

    "[redacted]&#39";"of&#39";"all&#39";"your&#39";"[redacted]@[redacted].com";"[redacted]@[redacted].com:hapa[redacted]hoha"

Это заставило PostgreSQL скопировать всю оставшуюся часть файла во второе поле как одно значение.

Вопрос

После всего сказанного мой последний вопрос заключается в следующем: как я могу заключить каждое значение в файле CSV в двойные кавычки таким образом, чтобы оно было правильно импортировано в PostgreSQL?

Прямо сейчас я приперт к стене и был бы признателен за любой совет, даже если это не четкий ответ. Я пробовал все, что мог придумать. Если ответ вообще возможен, я бы хотел, чтобы он мог применяться к CSV-файлам, содержащим более двух полей, поскольку после этого у меня есть еще много CSV-файлов для импорта.


person x n    schedule 20.07.2018    source источник


Ответы (1)


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

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

person Wayne Niddery    schedule 20.07.2018
comment
Я знаю, что могу это сделать, однако это то, что я бы назвал «хакерским решением», так как это решение не применимо ни к чему другому, что мне придется потом импортировать. Это решение работает только для 1. Ситуации, когда значения в первом поле точно не будут содержать разделитель и 2. Есть только два поля. После этого файла мне нужно импортировать еще 205 файлов CSV, которые, безусловно, будут включать много файлов с более чем двумя полями. - person x n; 20.07.2018
comment
Если у каждого файла разные, но похожие проблемы, я согласен, но не вижу особых возможностей обойти это. Источником проблемы является тот, кто предоставляет данные. В идеале вы могли бы вернуться к ним по любым каналам и заставить их форматировать что-то по-другому — достаточно просто использовать запятую в качестве разделителя в файле CommaSV и/или заключать в кавычки любые значения поля, которые содержат разделитель. Если это невозможно, то я ожидаю, что вы можете использовать множество хакерских решений. - person Wayne Niddery; 20.07.2018