【问题标题】:Prolog, Read data from CSV with different separatorProlog,使用不同的分隔符从 CSV 读取数据
【发布时间】:2016-07-05 14:44:10
【问题描述】:

我需要在 prolog 中读取不同的 CSV 文件,有些行格式为 0'\t,其他文件格式为空格 0'

我用过:

    read_points(Filename, Points) :-
       csv_read_file(Filename, P,[convert(true),functor(pt),separator(0'\t)]),
       csv_read_file(Filename, P,[convert(true),functor(pt),separator(0' )]).

但它不起作用,因为返回了两个不同的列表。

如何正确编码? 谢谢。

编辑: 带有'0\t 的示例文件:

0.1     5
3       5
5       8

'0 示例:

0.1 5
3 5
5 8

【问题讨论】:

  • 您能否展示一个示例,说明每种不同类型的 CSV 文件中的一行?
  • 我已经更新了这个问题。第一个示例使用 TAB 键,第二个示例仅使用空格键。
  • 所以你真正想做的是有一个谓词来判断文件是使用空格还是制表符并相应地返回列表?因为您向他们展示的各个csv_read_file 调用在相应的正确文件上工作正常。不幸的是,一旦实例化列表P,就无法重新实例化它。如果您想使其自动运行,您需要添加逻辑来检查文件使用的分隔符。
  • 是的,单独的谓词 csv_read_file 工作正常,但我需要创建一个单独的谓词,由我使用的文件独立工作,但我不知道如何。我厌倦了“或”,但给我两个列表 P。
  • 正如我所提到的,您要么 (a) 需要提前知道每个文件使用什么分隔符,并为每个文件使用不同的分隔符调用 不同 谓词,或者 (b)您需要编写一些代码来检查文件以查看它有什么分隔符。无论您使用什么分隔符,这两种文件都将成功解析,因为没有分隔符在 CSV 中不被视为错误,而是由表示单个字段的行组成的文件。如果您有任何包含空格但使用制表符分隔符的文件,则几乎无法区分。

标签: csv prolog swi-prolog


【解决方案1】:

我使用 If 语句解决它,并在第一行搜索是否有空格。

read(Filename, Elements) :-
(   space(Filename)
->   csv_read_file(Filename, L,[functor(line),separator(0' )])
;   csv_read_file(Filename, L,[functor(line),separator(0'\t)])
).

space(File):-
  read_first(File,L),
  once(member(32,L)).

read_first(File, sol) :-
  see(File),
  read_one_line(Codes),
  seen,
  Sol = Codes.

read_one_line(Codes) :-
  get0(Code),
  (   Code < 0 /* end of file */ ->
      Codes = []
  ;   Code =:= 10 /* end of line */ ->
      Codes = []
  ;   Codes = [Code|Codes1],
      read_one_line(Codes1)
  ).

【讨论】:

  • 我在评论中提出的这个解决方案的唯一问题是,在带有制表符分隔字段的文件中,您可能有一个包含空格的字段值,在这种情况下 space/1 将给出一个不正确的结果。因此,您的解决方案必须假定制表符分隔字段的字段值中没有空格。
  • 是的,我的练习和解决方案中只有两种类型的文件,制表符或空格文件!不是混合文件。但是在reed之前可以更改代码以逐行检查!
猜你喜欢
  • 2021-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多