繁体   English   中英

psql import .csv - 双引号字段和单双引号值

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

你好堆栈溢出者,

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

.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 保存,因为我的数字已转换为科学记数法,并且在 excel 中打开文件时会立即删除前导零。

这是一个丑陋的黑客,但您可以使用\\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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM