Требования к формату для чтения CSV-файлов в q/kdb+

(Я использую 32-битный KDB+ 3.3 на OS X.)

Если я скопирую и вставлю набор данных iris в 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
..

Очевидно, что мне нужно сделать сохранение в виде CSV-файла для Windows, и -comma-delimi">этот ответ объясняет различия, но какое это имеет значение для kdb+? И есть ли вариант, который я могу добавить в код для чтения в файлах MS-DOS csv?


person snd    schedule 29.12.2015    source источник


Ответы (1)


Я работаю на 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

Работает в любом случае

person terrylynch    schedule 29.12.2015