我正在使用 SWI-Prolog。
我有一个 csv 文件,其中第一行是探针,然后每一行都是一个样本:
1007_s_at 1053_at 117_at ...
GSM102447.CEL 1 0 0 ...
GSM102449.CEL 1 0 0 ...
GSM102451.CEL 1 0 0 ...
GSM102455.CEL 1 0 0 ...
GSM102507.CEL 1 0 1 ...
...
实际文件有超过 20,000 列('probes')和不超过 150 行('samples')。
我想提取每个关系并将它们作为事实打印在另一个文件中。
例如:
%probe_value_in_sample(Probe,Sample_Strip,ProbeValue).
probe_value_in_sample('1007_s_at','GSM102447',1).
etc
到目前为止我的代码:
foreach(csv_read_file_row_list('GSE2109_BarCode.csv', List), assert(['samples'|List])).
probe_value_in_sample(Probe,Sample_Strip,ProbeValue):-
[samples|[samples,Empty|ProbeList]],Empty='', %the first value is empty
indexOf(ProbeList,Probe,IndexOfProbe),
[samples|[samples,Sample|SampleValues]],Sample\='',
nth0(IndexOfProbe,SampleValues,ProbeValue),
name(Sample, CharSample),
append(Char_Sample_Strip,".CEL",CharSample),
name(Sample_Strip,Char_Sample_Strip).
%IndexOf(MyList, MyElement, MyIndex).
indexOf([Element|_], Element, 0).
indexOf([_|Tail], Element, Index):-
indexOf(Tail, Element, Index1),
Index is Index1+1.
这似乎运作良好,但不起作用,或者它太慢以至于无法与 findall 一起使用。
知道可能是什么问题吗?
感谢您的任何帮助。
更新
感谢你的回复。
我已经定义:
csv_read_file_row_list(File, List,Functor):-
csv_read_file_row(File,Row,[functor(Functor)]),Row=..List.
所以我有一个打开的文件而不是一个流,而 Functor 变量目前是多余的。
我对您如何使用 maplist 感到困惑?我不能让它工作。
我努力了:
:- dynamic samples/3.
csv_read_file_row_list(File, List,Functor):-
csv_read_file_row(File,Row,[functor(Functor)]),Row=..List.
prepare_db(File) :-
( nonvar(File) ; File = 'GSE2109_BarCode.csv' ),
%open(File, read, S),
csv_read_file_row_list(File, ['thing',_Empty|ColKeys],'thing'),
forall(csv_read_file_row_list(File, ['thing',RowKeyDirty|Samples],'thing'),
( clean_rowkey(RowKeyDirty, RowKey),
maplist(store_sample(RowKey), ColKeys, Samples)
)).
%close(S).
store_sample(RowKey, ColKey, Sample) :-
assertz(samples(RowKey, ColKey, Sample)).
clean_rowkey(RowKeyDirty, RowKey) :- append(RowKey, ".CEL", RowKeyDirty).
也:
:- dynamic samples/3.
csv_read_file_row_list(File, List,Functor):-
csv_read_file_row(File,Row,[functor(Functor)]),Row=..List.
prepare_db(File) :-
( nonvar(File) ; File = 'GSE2109_BarCode.csv' ),
%open(File, read, S),
csv_read_file_row_list(File, ['thing',_Empty|ColKeys],'thing'),
forall(csv_read_file_row_list(File, ['thing',RowKeyDirty|Samples],'thing'),
( clean_rowkey(RowKeyDirty, RowKey),
maplist(store_sample,[RowKey], ColKeys, Samples)
)).
%close(S).
store_sample(RowKey, ColKey, Sample) :-
assertz(samples(RowKey, ColKey, Sample)).
clean_rowkey(RowKeyDirty, RowKey) :- append(RowKey, ".CEL", RowKeyDirty).
但两者都失败了。