The new Interpreter
functionality in version 10 looks like it has the potential to make parsing custom data formats very easy. I'm trying to create a CSV parser.
Requirements:
- Rows are delimited by newlines, columns are delimited by commas.
- Entries can be numbers, strings (everything that's quoted or can't be interpreted as a number is a string).
- Commas in quoted strings must be ignored.
- Empty elements are allowed, e.g. this row contains three empty elements:
,,
. They're delimited by two commas. These can be parsed to eitherNull
or""
.
My actual problem doesn't have requirement 3. I put in more requirements in the hopes to make the question more generally useful, and I meant to accept answers that satisfy only a subset of these. (Perhaps this was misguided.) In the meantime Carlo's answer explains that requirement 3. can't be met.
Test data:
,"one","2"
"a",1,2
"b",3,"4c"
"c",5,x
"d",6,"seven, eight"
Or ready to paste Mathematica string:
csv = ",\"one\",\"2\"\n\"a\",1,2\n\"b\",3,\"4c\"\n\"c\",5,x\n\"d\",6,\"seven,eight\""
Parsed result should MatchQ
this pattern:
{{Null | "" | Missing[___], "one", "2"},
{"a", 1, 2},
{"b", 3, "4c"},
{"c", 5, "x"},
{"d", 6, "seven, eight"}}
How close can we get to this result, using Interpreter
?
Here's a first try:
int = Interpreter[
DelimitedSequence[
DelimitedSequence[
Restricted["String", "\"" ~~ ___ ~~ "\""] | "Number" | "String",
","
],
"\n"
]
]
int[csv]
What it gets wrong:
- fails on point 4. (this is actually important for me)
- fails on point 3.
- doesn't unquote strings
It may not be possible to implement all the features I request using Interpreter
, but how close can we get? How much time and effort can Interpreter
save when attacking this problem? Preferably it should be possible to offload most of the processing to interpreter and reach the desired result by adding minimal pre and/or post-processing.
Answer
I worked on Interpreter.
As far as the implentation is now, the DelimitedSequence parser does not support quoting, so what you want can't be done. We'll try to add it in a future version.
Comments
Post a Comment