2

我正在尝试加载一个制表符分隔的文本文件,其中包含一列值,这些值恰好看起来像一个日期,但不是。看来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 的过度帮助部分的帮助将不胜感激。谢谢你。

4

2 回答 2

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));
于 2013-04-06T05:50:14.473 回答
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 的错误:

未找到“dM-yyyy”列;SQL 语句:

我的 csv 文件:

firstdate|13-11-2013\n
seconddate|14-11-2013
于 2013-12-12T07:07:54.290 回答