我是这个非常有趣的博客的新手。这是我的问题:我必须在postgresql表中加载一个具有三列(field1, field2和field3)的csv文件。在field1列中包含的字符串中有新的行字符。我使用sql语句:
COPY test (regexp_replace (field1,, E '[\n\r] +', '', 'g'),
field2, field3)
from 'D:zzzaaa20.csv' WITH DELIMITER '|';
但是它报告了一个错误。
如何删除新的行字符?
如果换行符通过引用值正确转义,这应该不是问题。
如果您的数据是带有未转义换行符的损坏的CSV文件,则必须进行一些预处理。如果您愿意允许数据库用户在数据库服务器上执行程序,您可以使用
COPY mytable FROM PROGRAM 'demangle D:zzzaaa20.csv' (FORMAT 'csv');
这里,demangle
是一个程序或脚本,它读取文件,固定数据并将其输出到标准输出。由于您使用的是Windows,您可能无法访问sed
和awk
之类的工具,因此您可能必须自己编写。
所以,这是COPY
命令的语法:
COPY table_name [ ( column_name [, ...] ) ]
FROM { 'filename' | STDIN }
[ [ WITH ] ( option [, ...] ) ]
您只能添加可选的列名列表,而不能添加函数调用(在您的示例中为regexp_replace
)或其他一些复杂的结构。
您可以创建一些时态表,将数据导入其中,然后使用顺序INSERT...SELECT
查询复制表中的数据。