SWI Prolog中如何实现CSV字符串与数值列表的可逆解析?
SWI-Prolog中CSV行的双向解析实现
你编写的三个谓词仅能单向工作,核心原因是split_string/4和atomic_list_concat/3对参数实例化状态有严格要求:
split_string/4必须第一个参数(目标字符串)已实例化,才能分割出子串列表atomic_list_concat/3必须第二个参数(原子列表)已实例化,才能拼接成目标字符串- 唯一可逆的是
maplist(atom_number, T, L),只要T或L任意一方实例化,就能完成原子与数字的双向转换
整合后的双向谓词
通过判断参数的实例化状态,将两种方向的逻辑合并为一个谓词:
csv_string(S, L) :- % 正向:从CSV字符串解析为数字列表 nonvar(S), split_string(S, ',', ',', T), maplist(atom_number, T, L). csv_string(S, L) :- % 反向:从数字列表生成CSV字符串 nonvar(L), maplist(atom_number, T, L), atomic_list_concat(T, ',', S).
测试验证
正向解析
?- csv_string('1,2,3,4', L). L = [1, 2, 3, 4].
反向生成
?- csv_string(S, [1,2,3,4]). S = '1,2,3,4'.
可选优化
如果需要处理包含空字段的CSV(比如',2,,4'),保持split_string/4的第三个参数为','即可保留空字段;若不需要空字段,可将第三个参数改为'',此时连续分隔符会被忽略。
内容的提问来源于stack exchange,提问作者SteveP
相关产品推荐
相关产品推荐

