2016-07-05 2 views
0

Мне нужно прочитать другой файл 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')]). 

Но dosen't работу, потому что вернуть мне два разных списка.

Как я могу его правильно скопировать? Спасибо.

EDIT: пример файла с '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

Моя единственная проблема с этим решением, которое я поднял в своем комментарии, заключается в том, что в файле с полями, разделенными вкладками, вы можете иметь значение поля, которое содержит пробел, в этом случае 'space/1' даст неверный результат. Поэтому ваше решение должно предполагать, что в значениях полей для полей с разделителями табуляции нет пробелов. – lurker

+0

Да, там есть только два типа файла, вкладка o пробельного файла в моем упражнении и решении! Не смешанный файл. Но можно изменить код, чтобы проверять линию за строкой до тростника! – UserFromTheSpace

Смежные вопросы