2013-04-05 97 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 
相關問題