【问题标题】:Write data to CSV file from swi-prolog code从 swi-prolog 代码将数据写入 CSV 文件
【发布时间】:2014-12-05 16:50:34
【问题描述】:

如何从下面的序言代码将数据写入 CSV 文件?

谢谢,

SB

run:-
   member(A,[a,b,c,d,e]),
   member(B,[1,2,3,4,5,6]),
   write(A),write(' '),write(B),nl,
   fail.
run.

【问题讨论】:

  • @EugeneSh。我不确定这是否完全重复。本题询问的是其他问题中未提及的特定格式,即 CSV。
  • @WouterBeek 好吧,添加逗号而不是空格并更改文件扩展名?有这么大的区别吗?
  • @EugeneSh.: CSV 它是一种标准格式,很容易做对

标签: csv prolog swi-prolog


【解决方案1】:

简单的解决方案

由于您使用的是 SWI-Prolog,因此您可以使用 CSV library

?- use_module(library(csv)).
?- findall(row(A,B), (member(A, [a,b,c,d,e]), member(B, [1,2,3,4,5])), Rows), csv_write_file('output.csv', Rows).

如您所见,我分两步完成:

  1. 我创建row(A, B) 形式的术语。
  2. 然后我将这些术语交给csv_write_file/2,它负责创建语法正确的输出文件。

非标准分隔符

在您的问题中,您不是在AB 之间写一个逗号,而是一个空格。如果您真的想使用空格作为分隔符,您可以将其设置为选项:

csv_write_file('output.csv', Rows, [option(separator(0' )])

“不平衡”参数

另外,在您的问题中,B 的值比A 的值多。您可以编写代码来处理这个问题,但是有几种方法可以处理这个问题。例如,(1)您可以用nill 填充缺失的单元格; (2)same_length(As, Bs)失败可以抛出异常; (3) 你只能写“完整”行:

length(As0, N1),
length(Bs0, N2),
N is max(N1, N2),
length(As, N),
append(As, _, As0),
length(Bs, N),
append(Bs, _, Bs0),

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多