2016-07-05 5 views
0

異なるセパレータをCSVからデータを読み、いくつかの行が他のファイルに、0'\tでフォーマットされているが、空間0'でフォーマットされています。プロローグ、Iはプロローグに異なるCSVファイルを読み込むために必要

は、私が使用:

read_points(Filename, Points) :- 
     csv_read_file(Filename, P,[convert(true),functor(pt),separator(0'\t)]), 
     csv_read_file(Filename, P,[convert(true),functor(pt),separator(0')]). 

しかし、私に二つの異なるリストを返すので、それはうまくいきません。

どのように私はそれがcorrectleyコーディングすることができますか? ありがとうございます。

EDIT:'0\tと ファイルの例:'0

0.1  5 
3  5 
5  8 

は、例:

0.1 5 
3 5 
5 8 
+0

さまざまな種類のCSVファイルのそれぞれの行の例を表示できますか? – lurker

+0

私は質問を更新しました。 最初の例はTabキーで作成され、2番目の例はスペースバーのみで作成されます。 – UserFromTheSpace

+0

だから本当に、あなたがやりたいと思っているものをスペースまたはタブを使用して、ファイルがあるかどうかを把握し、それに応じてリストを返します単一の述語を持っているのですか?個別の 'csv_read_file'呼び出しは、対応する正しいファイルで正常に動作することを示します。残念なことに、いったんリストをインスタンス化すると、 'P'は、それを再インスタンス化することはできません。自動化しようとしている場合は、ファイルの区切り文字を調べるロジックを追加する必要があります。 – lurker

答えて

0

スペースかがある場合、私はそれがIfステートメントを使用して、最初の行で検索解決。

read(Filename, Elements) :- 
( space(Filename) 
-> csv_read_file(Filename, L,[functor(line),separator(0')]) 
; csv_read_file(Filename, L,[functor(line),separator(0'\t)]) 
). 

space(File):- 
    read_first(File,L), 
    once(member(32,L)). 

read_first(File, sol) :- 
    see(File), 
    read_one_line(Codes), 
    seen, 
    Sol = Codes. 

read_one_line(Codes) :- 
    get0(Code), 
    ( Code < 0 /* end of file */ -> 
     Codes = [] 
    ; Code =:= 10 /* end of line */ -> 
     Codes = [] 
    ; Codes = [Code|Codes1], 
     read_one_line(Codes1) 
). 
+0

私のコメントで提起したこの解決策の私の唯一の懸念は、タブで区切られたフィールドを持つファイルでは、 'space/1'が間違った結果を与えるスペースを含むフィールド値を持つことができるということです。だからあなたの解決策は、タブ区切りフィールドのフィールド値にスペースがないと仮定しなければなりません。 – lurker

+0

はい、私の練習と解決策では、2つのタイプのファイル、タブオスペースファイルしかありません!混合ファイルではありません。しかし、リードする前にラインごとにチェックするようにコードを変更することは可能です! – UserFromTheSpace

関連する問題