我使用Vertica客户端驱动程序8.1版,使用以下查询将数据保存到临时表:
COPY TempTableName FROM STDIN DIRECT DELIMITER '|' RECORD TERMINATOR 'rn' NO ESCAPE NO COMMIT;
当使用该语句将数据添加到临时表时,如果我使用了"|"在要保存的数据中。
解决此问题的方法之一是使用ENCLOSED BY参数,如:
COPY TempTableName FROM STDIN DIRECT DELIMITER '|' RECORD TERMINATOR 'rn' 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=>
这就是你想要的行为吗?