2016-07-05 48 views
0

我需要在prolog中讀取不同的CSV文件,某些行格式化爲0'\t,其他文件格式化爲0'序言,用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? 謝謝。

編輯: 例如與'0\t文件:

0.1  5 
3  5 
5  8 

例如與'0

0.1 5 
3 5 
5 8 
+0

你能展示一個來自你的每種不同類型的CSV文件的行的例子嗎? – lurker

+0

我已經更新了這個問題。 第一個示例是使用TAB鍵製作的,第二個示例僅使用空格鍵。 – 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

我在我的評論中提到的這個解決方案的唯一問題是,在一個帶有tab分隔字段的文件中,可能會有一個包含空格的字段值,在這種情況下,'space/1'會給出錯誤的結果。因此,您的解決方案必須假定字段值中沒有空格用於製表符分隔的字段。 – lurker

+0

是的,在我的練習中只有兩種類型的文件,標籤或空間文件和解決方案!沒有混合文件。但有可能改變代碼以逐行檢查蘆葦! – UserFromTheSpace

相關問題