psql import .csv - поля с двойными кавычками и значения с одинарными кавычками - PullRequest
0 голосов
/ 07 февраля 2020

Hello Stack Overflowers,

Странный вопрос. У меня проблемы с импортом файла .csv с использованием psql аргументов командной строки ...

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

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

Ex:
number, number, description  (Headers)
123,124,"description, description"
123,124,description, TV 55"
123,124,description, TV 50"

Command Ex:
\copy table FROM 'C:\Users\Desktop\folder\file.csv' CSV HEADER
\copy table FROM 'C:\Users\Desktop\folder\file.csv' WITH CSV HEADER QUOTE '"' ESCAPE '\' 

Я заметил, что сохранение с помощью Excel решает проблему ... Excel форматирует записи как. ..

number, number, description  (Headers)
123,124,"description, description"
123,124,"description, TV 55"""
123,124,"description, TV 50"""

Я не хочу сохранять в Excel, хотя у меня есть числа, которые превращаются в научную нотацию c, а начальные нули удаляются сразу после открытия файла в Excel.

1 Ответ

1 голос
/ 07 февраля 2020

Это ужасный хак, но вы можете импортировать в таблицу с одним столбцом с помощью \copy table from '/path/to/file' CSV quote e'\x01' delimiter e'\x02', а затем попытаться исправить это в SQL с помощью функций регулярных выражений. Это работает только с достаточно маленькими CSV, так как вы дублируете данные в таблице с одним столбцом во время импорта.

testdb=# create table import_data(t text);
CREATE TABLE
testdb=# \! cat /tmp/oof.csv
num0,num1,descrip
123,124,"description, description"
123,124,description, TV 55"
123,124,"description, TV 50""
testdb=# \copy import_data from /tmp/oof.csv csv header quote e'\x01' delimiter e'\x02'
COPY 3
testdb=# CREATE TABLE fixed AS
SELECT
  (regexp_split_to_array(t, ','))[1] num1,
  (regexp_split_to_array(t, ','))[2] num2,
  regexp_replace(
        regexp_replace(regexp_replace(t, '([^,]+,[^,]+),(.*)', '\2'),
                       '"(.*?)"', '\1'),
        '(.*)(")?', '\1\2') as descrip
FROM import_data;
SELECT 3
testdb=# select * from fixed;
 num1 | num2 |         descrip          
------+------+--------------------------
 123  | 124  | description, description
 123  | 124  | description, TV 55"
 123  | 124  | description, TV 50"
(3 rows)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...