Comment detail

RFC 4180対応版 CSVレコードの分解 (Nested Flatten)
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])).

Index

Feed

Other

Link

Pathtraq

loading...