2013-04-05 65 views
2

我试图加载一个制表符分隔的文本文件,其中包含一列值看起来完全像日期但不是。看起来,CSVREAD命令扫描行,将列中的文本值转换为java.Sql.Date,然后看到目标列是VARCHAR并执行toString()以获取值......这正是不是我需要的。我实际上需要原始的未转换文本,而不需要任何日期处理。H2 DB CSVREAD命令将数值转换为VARCHAR前的日期

那么,有没有办法在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

否认!哎呀!输入文件无效。有“3/10/2013 0:00:00”礼物。应该先验证一下。 – chaotic3quilibrium 2013-04-05 21:42:20

回答

4

(看来你发现了这一点你自己,但无论如何):

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)); 
+0

啊! Tyvm!我忘了你可以做非默认的解析途径。我非常感谢你的阐述。 – chaotic3quilibrium 2013-04-06 15:45:37

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', '|'); 

Bewa关于日期格式的单引号。当我尝试从托马斯的例子,它给了我一个错误使用H2:

未找到列“d-M-yyyy; SQL语句:

我的CSV文件:

firstdate|13-11-2013\n 
seconddate|14-11-2013