RFC 4180対応版 CSVレコードの分解
Posted feedbacks - Prolog
PrologでDCG使って書いてみました。
?- print_record('"aaa","b\nbb","ccc",zzz,"y""Y""y",xxx').
1 => aaa
2 => b
bb
3 => ccc
4 => zzz
5 => y"Y"y
6 => xxx
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | csv([R|Rs]) --> record(R), "\n", csv(Rs), !.
csv([R]) --> record(R), !.
csv([]) --> [].
record([D|Ds]) --> field(D), ",", record(Ds), !.
record([D]) --> field(D), !.
record([]) --> [].
field(D) --> "\"", quoted(D), "\"" ; naked(D).
naked([C|Cs]) --> [C], { \+ member(C, "\",\n") }, naked(Cs), !.
naked([]) --> [].
quoted([0'"|Cs]) --> "\"\"", quoted(Cs), !.
quoted([C|Cs]) --> [C], { C \== 0'" }, quoted(Cs), !.
quoted([]) --> [].
print_record(Atom) :-
name(Atom, CSV),
phrase(csv([Record]), CSV),
forall(nth1(N, Record, Data), writef('%w => %s\n', [N, Data])).
|

raynstard
#3389()
Rating1/1=1.00
[ reply ]