Saltar al contenido

Leer un archivo línea por línea en Prolog

Basta ya de investigar por todo internet ya que has llegado al espacio justo, tenemos la solución que necesitas recibir pero sin problemas.

Puedes usar read para leer el flujo. Recuerda invocar at_end_of_stream para asegurar que no haya errores de sintaxis.

Ejemplo:

leerArchivo.pl

main :-
    open('myFile.txt', read, Str),
    read_file(Str,Lines),
    close(Str),
    write(Lines), nl.

read_file(Stream,[]) :-
    at_end_of_stream(Stream).

read_file(Stream,[X|L]) :-
    + at_end_of_stream(Stream),
    read(Stream,X),
    read_file(Stream,L).

miArchivo.txt

'line 0'.
'line 1'.
'line 2'.
'line 3'.
'line 4'.
'line 5'.
'line 6'.
'line 7'.
'line 8'.
'line 9'.

Así al invocar main recibirá la salida:

?- main.
[line 0,line 1,line 2,line 3,line 4,line 5,line 6,line 7,line 8,line 9]
true 

solo configura main. La salida aquí es un ejemplo usando write, por supuesto. Configure para que coincida con su solicitud.

Supongo que este principio se puede aplicar para responder a su pregunta. Buena suerte.

En SWI-Prolog, la solución más limpia es escribir un DCG que describa qué es una “línea” y luego llamar a un predicado para cada línea. Use la biblioteca (pio) para aplicar el DCG a un archivo.

EDITAR: Según lo solicitado, considere:

:- use_module(library(pio)).

lines([])           --> call(eos), !.
lines([Line|Lines]) --> line(Line), lines(Lines).

eos([], []).

line([])     --> ( "n" ; call(eos) ), !.
line([L|Ls]) --> [L], line(Ls).

Ejemplo de uso: ?- phrase_from_file(lines(Ls), 'your_file.txt').

Hay más soluciones posibles en número y más razonables en rendimiento, para obtener líneas de texto sin formato sin interpretar de un archivo:

SWI-Prólogo:

read_line(S, X) :- 
   read_line_to_codes(S, L), 
   read_line2(L, X).

read_line2(end_of_file, _) :- !, fail.
read_line2(L, X) :-
   atom_codes(X, L).

Jekejeke Prólogo:

:- use_module(library(stream/console)).

Aquí hay algunos tiempos, leyendo un archivo de 655 líneas:

test :-
   open('', read, Stream),
   test(Stream),
   close(Stream).

test(Stream) :-
   read_line(Stream, _), !,
   test(Stream).
test(_).

SWI-Prólogo:

̀?- time((between(1,100,_), test, fail; true)).
% 328,300 inferences, 0.125 CPU in 0.143 seconds (88% CPU, 2626400 Lips)
true.

Jekejeke Prólogo:

?- time((between(1,100,_), test, fail; true)).
% Up 121 ms, GC 2 ms, Thread Cpu 94 ms (Current 05/07/19 17:19:05)
Yes

Supongo que una solución SWI-Prolog que lee en un string en cambio, en un átomo podría ser más rápido. Pero en lo anterior comparamos la lectura del átomo contra el átomo.

Recuerda que te damos el privilegio parafrasear tu experiencia si hallaste tu obstáculo en el momento oportuno.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *