Проблема заключается в term_to_atom(LineTerm,FinalLine)
.
Сначала мы читаем строку файла CSV в список кодов символов в read_line_to_codes(Input,Line)
.
Давайте смоделируйте ввод с помощью atom_codes/2
:
?- atom_codes('james,facebook,intel,samsung',Line).
Line = [106, 97, 109, 101, 115, 44, 102, 97, 99|...].
Затем мы рекомбинируем исходный атом, считанный в FinalLine
(это кажется расточительным, должен быть способ навести строку в непосредственно атом)
?- atom_codes('james,facebook,intel,samsung',Line),
atom_codes(FinalLine, Line).
Line = [106, 97, 109, 101, 115, 44, 102, 97, 99|...],
FinalLine = 'james,facebook,intel,samsung'.
Мы пытаемся отобразить этот атом в FinalLine
в термин LineTerm
, используя term_to_atom/2
?- atom_codes('james,facebook,intel,samsung',Line),
atom_codes(FinalLine, Line),
term_to_atom(LineTerm,FinalLine).
Line = [106, 97, 109, 101, 115, 44, 102, 97, 99|...],
FinalLine = 'james,facebook,intel,samsung',
LineTerm = (james, facebook, intel, samsung).
Здесь вы видите проблему: LineTerm
это не совсем список, а вложенный термин, использующий функтор ,
для разделения элементов:
?- atom_codes('james,facebook,intel,samsung',Line),
atom_codes(FinalLine, Line),
term_to_atom(LineTerm,FinalLine),
write_canonical(LineTerm).
','(james,','(facebook,','(intel,samsung)))
Line = [106, 97, 109, 101, 115, 44, 102, 97, 99|...],
FinalLine = 'james,facebook,intel,samsung',
LineTerm = (james, facebook, intel, samsung).
Этот термин ','(james,','(facebook,','(intel,samsung)))
также будет в окончательный результат, просто пишется по-другому: (james,facebook,intel,samsung)
и упакован в список: [(james,facebook,intel,samsung)]
Вы не хотите этот термин, вы хотите список. Вы можете использовать atomic_list_concat/2
для создания нового атома, который можно прочитать как список:
?- atom_codes('james,facebook,intel,samsung',Line),
atom_codes(FinalLine, Line),
atomic_list_concat(['[',FinalLine,']'],ListyAtom),
term_to_atom(LineTerm,ListyAtom),
LineTerm = [V1,V2,V3,V4].
Line = [106, 97, 109, 101, 115, 44, 102, 97, 99|...],
FinalLine = 'james,facebook,intel,samsung',
ListyAtom = '[james,facebook,intel,samsung]',
LineTerm = [james, facebook, intel, samsung],
V1 = james,
V2 = facebook,
V3 = intel,
V4 = samsung.
Но это скорее варвар c.
Мы должны выполните всю эту обработку за меньшее количество шагов:
- Считайте строку разделенных запятыми строк на входе.
- Преобразуйте это в список атомов или строк напрямую.
DCG кажутся правильным решением. Может быть, кто-то может добавить двухслойный.