Пролог прочитать файл и использовать данные в качестве входных данных для различных функций - PullRequest
2 голосов
/ 01 апреля 2020

Я хотел прочитать из файла и затем сохранить его в виде списка. Каждый раз, когда есть запятая, он объединит все символы перед запятой, чтобы сформировать новое слово. Новая строка укажет, что это новый подсписок. Это очень похоже на то, что java может делать при чтении файла. Я изучаю пролог и имею проблемы с чтением файла и получаю их в качестве входных данных для выполнения различных операций. Знаете ли вы какие-либо методы, которые могут помочь мне прочитать файл и использовать эти данные в качестве ввода для различных функций? Спасибо.

Читать файл:

Фалес, Оливия, Джексон, София

Канадская почта, София, Джексон, Оливия

Cisco, Оливия, София, Джексон

Код:

read_from_file(File, A):-
   open(File, read, Stream),
   get_char(Stream, Char1),
   process_the_stream(Char1, Stream, A),
   close(Stream).

write_on_file(File,Text):-
   open(File, append, Stream),
   write(Stream, Text), nl,
   close(Stream).

process_the_stream(end_of_file, _, []):- !.

process_the_stream(Char, Stream, [Char|B]):-
   write(Char),
   get_char(Stream, Char2),
   process_the_stream(Char2, Stream, B).

Токовый выход:

A = [' Т», ч, а, л, е, с, '', 'О', L, I, V, I, а, '', 'J', а, c, K, S, O , n, ',', 'S', o, p, h, i, a, '\ n', 'C', a, n, a, d, a, '', 'P', o , с, т, '', 'S', о, р, Н, I, а, '', 'J', а, c, K, S, O, N, '',» О», L, I, V, I, а, '\ п', 'C', I, S, c, о, '', 'О', L, I, V, I, a, ',', 'S', o, p, h, i, a, ',', 'J', a, c, k, s, o, n]

Выход желаний:

A = [[Фалес, Оливия, Джексон, София], [Почта Канады, София, Джексон, Оливия], [Cisco, Оливия, София, Джексон]]

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Используется SWI-Prolog 8.xy

:- use_module(library(csv)).

process_csv(File,Values) :-
    csv_read_file(File,Rows),
    rows_to_values(Rows,Values).

rows_to_values([],[]).
rows_to_values([Row|Rows],[Values|Values0]) :-
    row_to_values(Row,Values),
    rows_to_values(Rows,Values0).

row_to_values(Row,Values) :-
    Row =.. List,
    List = [_Functor|Values].

Пример выполнения

?- process_csv('C:/Users/Groot/Documents/Projects/Prolog/SO_question_189_data.txt',Values).
Values = [['Thales', 'Olivia', 'Jackson', 'Sophia'], ['Canada Post', 'Sophia', 'Jackson', 'Olivia'], ['Cisco', 'Olivia', 'Sophia', 'Jackson']].

Причина, по которой этот ответ отличается от вашего желаемого ответа, состоит в том, что атомы отмечены ' так что они являются атомами, а не переменными, потому что переменные начинаются с заглавных букв.

Если вы предпочитаете что-то попроще, то

:- use_module(library(csv)).

process_csv(File,Values) :-
    csv_read_file(File,Rows),
    maplist(row_to_values,Rows,Values).

row_to_values(Row,Values) :-
    Row =.. [_Functor|Values].
0 голосов
/ 03 апреля 2020

Простое портативное решение с использованием Logtalk, которое вы можете запустить в большинстве систем Prolog:


:- object(process).

    :- public(data/2).
    data(File, Data) :-
        open(File, read, Stream),
        reader::line_to_codes(Stream, Line),
        process_data(Line, Stream, Data),
        close(Stream).

    process_data(end_of_file, _, []).
    process_data([Code| Codes], Stream, [Names| Data]) :-
        atom_codes(Atom, [Code| Codes]),
        atom::split(Atom, ',', Names),
        reader::line_to_codes(Stream, Line),
        process_data(Line, Stream, Data).

:- end_object.

Пример вызова, предполагая, что файл данных без пустых строк и пробелов между именами, как в примере данных вопроса содержимое файла:

| ?- {types(loader), reader(loader), process}.
...
yes

| ?- process::data('data.txt', Names).
Names = [['Thales', 'Olivia', 'Jackson', 'Sophia'], ['Canada Post', 'Sophia', 'Jackson', 'Olivia'], ['Cisco', 'Olivia', 'Sophia', 'Jackson']]
yes
...