2015-12-29 53 views
0

(我使用的是32位KDB + 3.3 OS X.)讀取CSV文件到Q/KDB +

如果我複製並粘貼iris dataset到Excel並保存爲「MS-DOS格式要求逗號分隔(.csv)」,並讀入KDB +,我得到這個:

q)("FFFFS";enlist ",")0:`iris.csv 
5.1al Length Sepal Width Petal Length Petal Width Species 
------------------------------------------------------------- 

如果我將其保存爲 「的Windows逗號分隔(.csv)」,我得到這個:

q)("FFFFS";enlist ",")0:`iris.csv 
Sepal Length Sepal Width Petal Length Petal Width Species 
--------------------------------------------------------- 
5.1   3.5   1.4   0.2   setosa 
4.9   3   1.4   0.2   setosa 
4.7   3.2   1.3   0.2   setosa 
4.6   3.1   1.5   0.2   setosa 
5   3.6   1.4   0.2   setosa 
5.4   3.9   1.7   0.4   setosa 
4.6   3.4   1.4   0.3   setosa 
5   3.4   1.5   0.2   setosa 
4.4   2.9   1.4   0.2   setosa 
4.9   3.1   1.5   0.1   setosa 
.. 

明顯地保存爲Windows csv是我需要做的,而this answer explains the differences,但爲什麼這對於kdb +很重要?是否有一個選項可以添加到代碼中讀取MS-DOS csv文件?

回答

2

我在windows上而不是在OSX上運行,所以我只能重現相反的問題,但它會以相同的方式。

使用「read0」查看區別。在我的情況:

q)read0 `:macintosh.csv 
"col1,col2\ra,1\rb,2\rc,3" 

q)read0 `:msdos.csv 
"col1,col2" 
"a,1" 
"b,2" 
"c,3" 

爲了使用0:將文件解析爲一個表,KDB期待多串(如在我的MSDOS文件),而不是在新行並沒有認識到,單一的字符串。

所以我得到:

q)("SI";enlist ",")0:`:msdos.csv 
col1 col2 
--------- 
a 1 
b 2 
c 3 

q)("SI";enlist ",")0:`:macintosh.csv 
aol1 col2 
----------- 

你可以把東西在你的代碼,認清形勢,並相應地處理它,但它會更慢且效率較低:

q)("SI";enlist ",")0:{$[1=count x;"\r" vs first x;x]}read0 `:msdos.csv 
col1 col2 
--------- 
a 1 
b 2 
c 3 

q)("SI";enlist ",")0:{$[1=count x;"\r" vs first x;x]}read0 `:macintosh.csv 
col1 col2 
--------- 
a 1 
b 2 
c 3 

作品無論哪種方式