关于 postgresql:psql import .csv – 双引号字段和单双引号值

psql import .csv - Double Quoted fields and Single Double Quote Values

你好堆栈溢出者,

奇怪的问题。我在使用 psql 命令行参数导入 .csv 文件时遇到问题...

.csv 以逗号分隔,并且在其中包含逗号的单元格/字段周围有双引号。我遇到了一个问题,其中一个单元格/字段有一个用于英寸的双引号。所以在下面的例子中,它认为底部的两行都是一个单元格/字段。

我似乎找不到正确进行此导入的方法。我希望不必对文件本身进行更改,只需调整我的 psql 命令。

1
2
3
4
5
6
7
8
9
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 将记录格式化为...

1
2
3
4
NUMBER, NUMBER, description  (Headers)
123,124,"description, description"
123,124,"description, TV 55"""
123,124,"description, TV 50"""

但我不想使用 excel 保存,因为我的数字已转换为科学记数法,并且在 excel 中打开文件时会立即删除前导零。


这是一个丑陋的 hack,但您可以使用 \\copy table from '/path/to/file' CSV quote e'\\x01' delimiter e'\\x02' 导入单列表,然后尝试使用正则表达式函数在 SQL 中修复它。这仅适用于相当小的 CSV,因为您在导入时会复制单列表中的数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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)