hello rakoons,
I want to be able to parse this:
CSV.parse(
'162,1,2,"Watt, Mrs. James (Elizabeth ""Bessie"" Inglis
Milne)",female,40,0,0,C.A. 33595,15.75,,S',
actions => CSV_as_table.new,
).made.say;
I wrote this simple Grammar and action
grammar CSV {
rule TOP {<line>* %% \n }
token line { <col>* %% ',' }
proto token col {*}
token col:sym<bare> { <-[\n",]>* }
token col:sym<quoted> {
'"' ~ '"'
[ <( [ '""' | <-[\n"]> ]* )> ]
}
}
class CSV_as_table {
method TOP ($/) { make $/<line>.map: *.made }
method line ($/) { make $/<col>.map: *.made }
method col:sym<bare> ($/) { make ~$/ }
method col:sym<quoted> ($/) { make ~$/ }
# method col:sym<quoted> ($/) { make S:g/'""'/'"'/ with ~$/ }
}
And it *almost* work. the thing I try to do now is to replace the "" in
quoted strings by a simple ".
when I use
method col:sym<quoted> ($/) { make S:g/'""'/'"'/ with ~$/ }
instead of
method col:sym<quoted> ($/) { make ~$/ }
I get this error message:
Cannot assign to a readonly variable or a value
in method col:sym<quoted> at whole.raku line 17
in regex col:sym<quoted> at whole.raku line 7
in regex col at whole.raku line 5
in regex line at whole.raku line 4
in regex TOP at whole.raku line 3
in block <unit> at whole.raku line 30
I just don't understand why so i come with 2 questions
(or 4):
* how to fix it (and why isn't it working) ?
* am I right when i feel there is a way to do this substitution inside
the grammar (and is it a good idea) ?
regards,
marc