(язык kdb+/Q) Создание отдельных файлов таблиц из парсера импорта CSV(отредактировано)

У меня есть (большой) файл CSV с некоторыми данными. И у меня есть импортер из code.kx.com, использующий .Q.fsn

colnames:`Symbol`Date`Time`Sequence`Exchange`Type`Level`Condition`Price`Size`BuyerID`SellerID
.Q.fsn[{`:newCreatedFile upsert flip colnames!("SDTISSISFISS";",") 0:x};`:C:/myDir/data.csv 5000000]

Этот код создает файл с именем newCreatedFile с данными из data.csv, предполагая, что файл больших данных обрабатывает данные фрагментами по 5000000 байт.

Вопрос:

Я хочу создать 2 отдельных файла из этих данных, и, скажем, основой для различия являются значения в столбце «Условие». Для каждой строки, если значение в столбце «Условие» равно x, y или z, поместить в файл A.csv, иначе — B.csv.

Вот псевдокод оператора if:

$[Condition in `x`y`z; Afunction ; Bfunction]
Afunction:{`:newA upsert flip ...};
Bfunction:{`:newB upsert flip ...};

Как мне настроить оператор if? В настоящее время у меня есть:

$[datatable.Condition = `SomeCondition; fileA;fileB]

Но я получаю ошибку типа. Как мне сопоставить каждое значение определенного столбца?

Должен ли он проверять при импорте исходного файла данных или после того, как файл данных был создан в таблице в kdb?


person user2498110    schedule 18.06.2013    source источник


Ответы (1)


Вы еще не проанализировали столбец в своем примере, когда проверяете условие, это нужно сделать в первую очередь. Вы можете использовать что-то вроде следующего:

foo:{t:flip colnames!("SDTISSISFISS";",") 0:x;
     `:newA upsert select from t where Condition = `SomeCondition;
     `:newB upsert select from t where not Condition = `SomeCondition}

.Q.fsn[foo;`:C:/myDir/data.csv;5000000]
person user1895961    schedule 18.06.2013
comment
Позвольте мне просто посмотреть, правильно ли я понимаю ваш код, вы создали функцию с именем foo, и первая строка присваивает переменную t таблице, импортированной из файла x. вторая и третья строки создают newA или newB на основе условий, как вы это сделали без использования операторов $ или if? - person user2498110; 18.06.2013
comment
Это делается в операторе select. Итак, t — это kdb-форма фрагмента таблицы. Затем мы выбираем строки из t, где Condition = `SomeCondition, и вставляем в newA. Затем мы выбираем строки из t, где условие не выполняется, и вставляем их в newB. - person user1895961; 18.06.2013
comment
О, я вижу. Да, у меня не было возможности сделать это с помощью $ или if-else, потому что условие должно оцениваться как логическое, и у меня нет возможности сопоставить этот тип значения со значениями условия, которые являются символами. - person user2498110; 18.06.2013
comment
Condition in `x`y`z оценивается как логическое значение. например 1b = `x in `x`y - person skeevey; 19.06.2013