yooskeh #1959(2007/08/07 03:37 GMT) [ Prolog ] Rating1/1=1.00
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])).
Rating1/1=1.00-0+
[ reply ]
yooskeh #1959() [ Prolog ] Rating1/1=1.00
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 => xxxcsv([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])).Rating1/1=1.00-0+
[ reply ]