将csv文件读入q/kdb+的格式要求

Format requirements for reading csv files into q/kdb+

(我在 OS X 上使用 32 位 KDB+ 3.3。)

如果我将 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 文件?

我 运行 在 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: 将文件解析为 table,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

两种方式都有效