问题描述
我使用 Vertica 客户端驱动程序 8.1 版使用以下查询将数据保存到临时表:
copY TempTableName FROM STDIN DIRECT DELIMITER '|' RECORD TERMINATOR '\r\n' NO ESCAPE NO COMMIT;
在使用此语句将数据添加到临时表时,如果我使用了“|”,则会出现错误在要保存的数据中。
解决此问题的方法之一是使用 ENCLOSED BY 参数,例如:
copY TempTableName FROM STDIN DIRECT DELIMITER '|' RECORD TERMINATOR '\r\n' ENCLOSED BY '"' NO ESCAPE NO COMMIT;
但是在这种情况下,如果我在要保存的数据中使用 " 会导致错误。这是处理此问题的通用方法并插入所有可能的字符 ('",.;/:?~!@# $%^&*|/) 保存时在键盘上。
解决方法
经典的 csv 问题。
Vertica COPY 的默认解析器接受栏作为列分隔符,如果字符串被引用,则字符串中的栏作为非分隔符。如果引号本身在字符串中,默认解析器希望它被反斜杠转义。
所以如果你的桌子是:
CREATE TABLE bar (
id INT,fullname VARCHAR(64),dob DATE
);
然后,您的数据文件:bar.csv
,可能如下所示:
42|"The Bar \" | \" at the End of the Street"|"1952-02-15"
你加载它,例如:
marvin ~/1/Vertica/supp $ vsql
Welcome to vsql,the Vertica Analytic Database interactive terminal.
Type: \h or \? for help with vsql commands
\g or terminate with semicolon to execute query
\q to quit
sbx=> COPY bar FROM LOCAL 'bar.csv' DELIMITER '|' ENCLOSED BY '"' EXCEPTIONS '/dev/tty' REJECTMAX 2;
Rows Loaded
-------------
1
(1 row)
sbx=> -- show the loaded data ...
sbx=> SELECT * FROM bar;
id | fullname | dob
----+----------------------------------------+------------
42 | The Bar " | " at the End of the Street | 1952-02-15
(1 row)
sbx=>
这是您要寻找的行为吗?