我正在尝试加载制表符分隔的文本文件,其中包含一列看起来与日期完全相同的值,但不是。似乎CSVREAD命令扫描行,将列中的文本值转换为java.Sql.Date,然后看到目标列是VARCHAR并执行toString()以获取值...这正是不是我需要的。我实际上需要原始的未转换文本,没有任何日期处理。
那么,有没有办法在CSVREAD命令中关闭“有用的类似日期的列转换”?
这是我可以用来证明不良行为的最简单的案例:
CREATE TABLE x
(
name VARCHAR NOT NULL
value VARCHAR
) AS
SELECT * CSVREAD('C:\myfile.tab', null, 'UTF-8', chr(9))
;
该文件包含三行,一个标题和两个值记录:
name\tvalue\n
x\t110313\n
y\t102911\n
如何帮助我绕过CVSREAD无用的部分将不胜感激。谢谢。
答案 0 :(得分:4)
(看来你自己发现了这个,但无论如何):
对于CSVREAD
,所有列都是字符串。 CSVREAD
函数或数据库不尝试将值转换为日期,或以任何其他方式尝试检测数据类型。数据库只执行您要求的操作,在您的情况下将数据读取为字符串。
如果您确实想要将列转换为日期,则需要明确地执行此操作,例如:
CREATE TABLE x(name VARCHAR NOT NULL, value TIMESTAMP) AS
SELECT *
FROM CSVREAD('C:\myfile.tab', null, 'UTF-8', chr(9));
如果需要非默认解析,您可以使用:
CREATE TABLE x(name VARCHAR NOT NULL, value TIMESTAMP) AS
SELECT "name", parsedatetime("value", "M/d/y") as v
FROM CSVREAD('C:\myfile.tab', null, 'UTF-8', chr(9));
答案 1 :(得分:2)
对于那些csv文件中没有标题的人,示例可能是这样的:
CREATE TABLE x(name VARCHAR NOT NULL, value TIMESTAMP) AS
SELECT "0", parsedatetime("1", 'd-M-yyyy') as v
FROM CSVREAD('C:\myfile.tab', '0|1', 'UTF-8', '|');
请注意日期格式周围的单引号。当我尝试使用Thomas的例子时,它使用H2给出了一个错误:
未找到“d-M-yyyy”栏; SQL语句:
我的csv文件:
firstdate|13-11-2013\n
seconddate|14-11-2013