【问题标题】:How to preserve new line character while performing psql copy command如何在执行 psql 复制命令时保留换行符
【发布时间】:2018-11-22 23:35:11
【问题描述】:

我的 csv 文件中有以下内容(包含 3 列):

141413,"\"'/x=/></script></title><x><x/","Mountain View, CA\"'/x=/></script></title><x><x/"

148443,"CLICK LINK BELOW TO ENTER^^^^^^^^^^^^^^","model\
\
xxx lipsum as it is\
\
100 sometimes unknown\
\
travel evening market\
"

当我使用以下命令在 mysql 中导入上述 csv 时,它会将反斜杠()视为新行;这是预期的行为。

LOAD DATA INFILE '1.csv' INTO TABLE users FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\n';

MYSQL Output

但是当我尝试使用复制命令导入 psql 时,它会将 \ 视为普通字符。

copy users from '1.csv' WITH (FORMAT csv, DELIMITER ',', ENCODING 'utf8', NULL "\N", QUOTE E'\"', ESCAPE '\');

postgres Output

【问题讨论】:

  • ESCAPE 选项定义转义引号字符的字符,它与多行记录无关。如果正确引用了值(在 CSV 模式下),则会自动检测多行记录。需要把输入文件中的反斜杠去掉(一般情况下,反斜杠在SQL中是没有意义的)

标签: postgresql csv-import postgresql-copy


【解决方案1】:

在导入 CSV 文件之前尝试解析这些 \,例如使用perl -pesed 以及来自psqlSTDIN

$ cat 1.csv | perl -pe 's/\\\n/\n/g' | psql testdb -c "COPY users FROM STDIN WITH (FORMAT csv, DELIMITER ',', ENCODING 'utf8', NULL "\N", QUOTE E'\"', ESCAPE '\');"

这是导入后的样子:

testdb=# select * from users;
   id   |                 company                 |                    location                     
--------+-----------------------------------------+-------------------------------------------------
 141413 | "'/x=/></script></title><x><x/          | Mountain View, CA"'/x=/></script></title><x><x/
 148443 | CLICK LINK BELOW TO ENTER^^^^^^^^^^^^^^ | model                                          +
        |                                         |                                                +
        |                                         | xxx lipsum as it is                            +
        |                                         |                                                +
        |                                         | 100 sometimes unknown                          +
        |                                         |                                                +
        |                                         | travel evening market                          +
        |                                         | 
(2 Zeilen)

【讨论】:

    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 2022-01-08
    • 2014-09-26
    • 2023-03-18
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多