【问题标题】:Prolog - parsing a csv fileProlog - 解析 csv 文件
【发布时间】:2014-04-20 14:38:33
【问题描述】:

我尝试解析一个 csv 文件并从每一行中提取一个特定的列数据,我已经设法将文件解析为一个记录列表,但我无法遍历每个记录的字段。 他们是一种使用 prolog 解析 csv 文件的方法,以便 csv 文件的每条记录本身都是一个列表?

我的代码:

:- use_module(library(csv)).

% main function ,  first parse the file then extracts max total market  
get_rows_data(File,Rows) :-
   csv_read_file(File, Rows, [functor(record), arity(18)]),
   maplist(assert, Rows),
   get_row(Rows).

get_row([]).    
get_row([Head|Tail]) :-
   write('*********************************'),write(Head),
   get_row(Tail). 

【问题讨论】:

    标签: csv prolog swi-prolog


    【解决方案1】:

    我会说你快到了。您只需要将记录词转换为列表即可。

    :- use_module(library(apply)).
    :- use_module(library(csv)).
    
    get_rows_data(File, Lists):-
      csv_read_file(File, Rows, []),
      rows_to_lists(Rows, Lists).
    
    rows_to_lists(Rows, Lists):-
      maplist(row_to_list, Rows, Lists).
    
    row_to_list(Row, List):-
      Row =.. [row|List].
    

    【讨论】:

    • 嘿,谢谢你的帮助,我不知道为什么,但程序的输出是假的。我是 prolog 的新手,我真的不明白为什么它不起作用,有什么线索吗?
    • functor(record) 需要是 functor(row),或者 Row =.. [row|List] 需要是 Row =.. [record|List]。或者您可以完全关闭选项[functor(record), arity(18)]
    • @lurker 确实,我错过了这些选项......相应地修正了我的答案。顺便说一句,是否存在将 arity 选项用作输入而不用作输出的用例?
    • 我有一个更一般的问题,我如何使用 DCG 来解析文件而不是内置的 csv_read_file() 函数?这甚至可能吗?
    • @user2512231 确实有可能,Prolog 对 DCG 的支持非常好。看看library(pure_input),特别是phrase_from_file(csv(Rows), CsvFile)
    猜你喜欢
    • 2012-06-24
    • 1970-01-01
    • 2016-09-16
    • 2011-04-25
    • 2016-05-04
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多