Vertica客户端驱动程序将数据加载到临时表



我使用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=> 

这就是你想要的行为吗?

最新更新