Prolog读取CSV文件后提取国家名称字符串的技术问题
解决Prolog读取CSV提取国家名称的问题
问题分析
你当前的代码只提取了列表的第一个row/1项,没有遍历整个列表,也没有从row结构中剥离出带分号的国家名称原子,更没处理掉末尾的分号。
解决方案
可以通过递归遍历列表+模式匹配提取原子+拆分原子去分号三步实现,或者直接指定CSV分隔符简化处理:
方案1:手动拆分带分号的原子
% 主谓词:读取CSV并转换为国家名称列表 read_KB(L) :- csv_read_file("/Users/dylan/Desktop/country.csv", R), process_rows(R, L). % 辅助谓词:递归处理每一行,提取国家名称 process_rows([], []). process_rows([row(CountryAtom)|RestRows], [CountryName|RestNames]) :- % 拆分原子,去掉末尾的分号 atom_concat(CountryName, ';', CountryAtom), process_rows(RestRows, RestNames).
方案2:指定CSV分隔符(更简洁)
你的CSV文件实际用分号作为分隔符,直接在csv_read_file中指定separator(;),读出来的row原子就不带分号了:
read_KB(L) :- csv_read_file("/Users/dylan/Desktop/country.csv", R, [separator(;)]), process_rows(R, L). process_rows([], []). process_rows([row(CountryAtom)|RestRows], [CountryString|RestNames]) :- % 可选:把原子转换为字符串(如果需要字符串类型而不是原子) atom_string(CountryAtom, CountryString), process_rows(RestRows, RestNames).
代码说明
process_rows/2递归遍历CSV读取到的row列表,把每个row(Atom)转换为纯国家名称;atom_concat/3用于拆分带分号的原子,分离出国家名称;atom_string/2可选,用于将Prolog原子转换为字符串类型(如果你的需求是字符串列表而非原子列表)。
内容的提问来源于stack exchange,提问作者Dylan Nico
相关产品推荐
相关产品推荐

