list - Prolog 读取文件并将数据用作不同功能的输入
问题描述
我想从文件中读取,然后以列表的形式存储。每有一个逗号,它将逗号前的所有字符组合成一个新词。一个新行将表明它是一个新的子列表。这与 java 在读取文件时可以执行的操作非常相似。我正在学习序言并且在读取文件并将它们作为输入以执行不同的操作时遇到问题。您知道任何可以帮助我读取文件并将这些数据用作不同功能的输入的方法吗?谢谢你。
阅读文件:
泰勒斯、奥利维亚、杰克逊、索菲亚
加拿大邮政,索菲亚,杰克逊,奥利维亚
思科、奥利维亚、索菲亚、杰克逊
代码:
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 = ['T',h,a,l,e,s,',','O',l,i,v,i,a,',','J',a,c,k,s ,o,n,',','S',o,p,h,i,a,'\n','C',a,n,a,d,a,' ','P',o ,s,t,',','S',o,p,h,i,a,',','J',a,c,k,s,o,n,',','O' ,l,i,v,i,a,'\n','C',i,s,c,o,',','O',l,i,v,i,a,',', 'S',o,p,h,i,a,',','J',a,c,k,s,o,n]
愿望输出:
A = [[泰勒斯,奥利维亚,杰克逊,索菲亚],[加拿大邮政,索菲亚,杰克逊,奥利维亚],[思科,奥利维亚,索菲亚,杰克逊]]
解决方案
这使用 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].
推荐阅读
- reactjs - 创建一个直接下载按钮 firebase 存储 ReactJs
- android - 如何在 React Native Expo 中读取 HC06 Arduino 蓝牙模块发送的消息
- php - 警告:mysqli_select_db() 期望参数 1 为 mysqli,bool 给定
- vue.js - 如何解决:在 Vue 测试中无法在模块外使用 import 语句并开玩笑?
- php - 成功的 .ajax() POST 不会将变量传递给 PHP
- ios - 用户如何在不直接点击选项卡的情况下更改选项卡?
- node.js - 告诉 Cloud Run 实例终止
- mysql - MYSQL 语法帮助
- css - Bootstrap 4 - 向上滚动时避免缩小导航栏
- python - 如何从 Python 中的 REST 响应中获取嵌套的 JSON 对象