簡體   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