r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[Parse] Discussion of PARSE dialect

MichaelAppelmans
9-Jun-2005
[217x2]
newby here: can anyone direct me to a sample of  code which matches 
a pattern over multiple text lines? I need to process a 5MB text 
file and remove all patterns of multiple consecutive email address 
es eg. [foo-:-my-:-com]; [foou-:-you-:-net] except the multiple email address 
string spans mulitple lines. Thanks for any pointers
and the multiple email address string occurs multiple times ;)
Brock
9-Jun-2005
[219x2]
Michael, this is going to be a very general response to your request. 
 Review setting up parse rules and use something like...
   parse text any [rule1 | rule2 | rule3]
Here's some Parse documentation from the Rebol/Core guide to get 
you started.  Share your progress and questions, maybe a line of 
sample data or two and maybe I can be of more help.
Brock
10-Jun-2005
[221]
link would help!!!   http://www.rebol.com/docs/core23/rebolcore-15.html
MichaelAppelmans
11-Jun-2005
[222]
thanks Brock.. I wound up doing it in Perl, as I'm more familiar 
with it's regex support. The problem always seems I'm in a hurry 
with crisis response which is not a good learning environment ;)
Volker
11-Jun-2005
[223]
Sometimes it helps to parse in two steps. a loop for each line-group 
and parsing that group seperately. becaus ethen 'to/'thru work better.
Ammon
16-Jun-2005
[224]
Can anyone give me some insight on how to use Brett's visual parse 
tools?
MichaelB
16-Jun-2005
[225]
Can somebody explain me why 'parse fails in the first case and returns 
true in the second case ?

r: [any into ['a (print 'a)]]
t: [[a][a][a]]
print parse t r 
->
a
a
a
false

r: [any [into ['a (print 'a)]]]
print parse t r 
->
a
a
a
true 


In the second 'r(ule) the additional [ ] make it kind of explicit, 
but shouldn't return the first version true as well ? Am I forgeting 
something what 'parse "thinks" when looking at the first 'r(ules) 
? Thanks for hints. :-)
Ladislav
16-Jun-2005
[226]
this really looks like violating the principle of the least surprise, 
I suggest you to submit it to Rambo
Romano
16-Jun-2005
[227]
MichaelB, It is a parse bug for me.
MichaelB
17-Jun-2005
[228]
As Ladislav suggested, I put it to Rambo. Thanks.
Pekr
22-Jun-2005
[229]
I have CSV file and I have trouble using parse one-liner. The case 
is, that I export tel. list from Lotus Notes, then I save it in Excel 
into .csv for rebol to run thru. I wanted to use:

foreach line ln-tel-list [append result parse/all line ";"]


... and I expected all lines having 7 elements. However - once last 
column is missing, that row is incorrect, as rebol parse will not 
add empty "" at the end. That is imo a bug ...
Gabriele
22-Jun-2005
[230x2]
btw, why /all? shouldn't excel surround elements with spaces with 
quotes?
anyway, is it really a problem that the last column is missing?
Pekr
22-Jun-2005
[232x3]
I used csv = semicolon separated values and no quotes in-there ...
yes, it is, as I expect all lines having 7 elements ... once there 
is not such an element, I can't loop thru result ... well, one condition 
will probably solve it, but imo it is a gug .... rebol identifies 
;; and puts "" inthere, but csv, at the end, will use "value;", and 
rebol does not count that ...
gug = bug :-)
Gabriele
22-Jun-2005
[235]
hmm, either use append/only, or as you say add it manually. submit 
this example to rambo if you think it's a bug.
Pekr
22-Jun-2005
[236x2]
append/only will not help, result of parse will varry, and it should 
not ...
I will put that in RAMBO then ...
Gabriele
22-Jun-2005
[238]
append/only will, because pick returns none if a column is not present, 
and set works with that too
Pekr
22-Jun-2005
[239]
but I like to use flat structure and foreach [real name of vars here], 
so I need consistent record length :-)
Gabriele
22-Jun-2005
[240]
i do too usually, just suggesting an alternative :-)
Pekr
22-Jun-2005
[241]
hmm, if (length? tmp) <> 7 [append tmp ""] will hopefully help :-)
Allen
22-Jun-2005
[242]
Pekr for now, just add an extra "," as you parse each row. That will 
give you a consistent length with the current behaviour
Pekr
22-Jun-2005
[243]
oh no, I am at the ends ... so bye bye beautifull oneliners ... I 
just found item which contains set of quotes :-) rebol will not translate 
that and my block is confused once again :-)
Allen
22-Jun-2005
[244]
foreach line ln-tel-list [append result parse/all join line ";" ";"]
Pekr
22-Jun-2005
[245x3]
damned, I will delete that contact and I will be done ;-) One contact 
from 3 000 does not count, even if that is secreatery of general 
director :-)
thanks allen, might work ....
but still - should I fill RAMBO bug? Imo rebol should add empty quotes 
automatically, if the line ends with ;
Allen
22-Jun-2005
[248]
Put it in for Carl to decide. Mention the work around too
Pekr
22-Jun-2005
[249x2]
why are following quotes causing a trouble? I did not ask rebol to 
take them into accout?

parse/all {test1    ;test2;"test3   "quoted""} ";"

["test1     " "test2" "test 3 " {quoted""}]

that is really completly weird ...
the only delimiter I asked rebol to use was semicolon, so everything 
following test2; should be one element ...
Allen
22-Jun-2005
[251x2]
That's a good one for the parse/all test suite. Rambo it.
; same bug again here too.
parse/all {a: b ":" c} ":"
== ["a" { b "} " c"]
Pekr
22-Jun-2005
[253]
OK, submitting ...
Allen
22-Jun-2005
[254]
; would have expected
== ["a" { b "}  {" c}]
sqlab
23-Jun-2005
[255]
I just remember, that this was discussed already.
The solution was to use something like
 
  split: func [string delim /local tokens token] [
      tokens: make block! 32
      parse/all string [

          any [copy token to delim (append tokens probe token) delim]
          copy token to end (append tokens token)
      ]
      tokens
  ]
Vincent
23-Jun-2005
[256]
sqlab: if 'parse can't do it, 'parse can do it ;)
Alek_K
6-Jul-2005
[257x3]
I have "(name1) - (name2) (result)"
eg. {team one - team two 3,0-3,0}

Any simple solution to split it ["team one" "team two" "3,0-3,0"]?
I've done such a rule:
[copy x to "-" (team1: x)
-
 any " " copy x to " " (team2: x)
 
any [mark: alpha :mark copy x to " " (append team2 join x " ")]
any " "
x: digit to end (result: x)]
Chris
6-Jul-2005
[260x3]
How many possibilities are there for the values "team one" and "team 
two"?  Could you use a team repository? --
teams: ["team one" | "team two"]

chars-n: charset "0123456789"
points: [1 4 chars-n "," 1 4 chars-n]
score: [points "-" points]

parse str [teams "-" teams score]
str: {team one - team two 3,0-3,0}  ;-- natch
Tomc
7-Jul-2005
[263x2]
not really simple but: 

name: complement charset {1234567890-}
score: [integer! "," integer! "-" integer! "," integer!]
str: {team one - team two 3,0-3,0}
rst: copy []
parse/all str [
	2 [copy token some name(append rst trim token) opt "-"] 
	copy token score (append rst token)
]
rst
of course this would preclude names like "team were#1"
Alek_K
7-Jul-2005
[265]
Thank You, it's nice to see such a pretty solutions :)
Ingo
3-Aug-2005
[266]
What are the recursion limits on 'parse? Because I just hit it in 
the imap:// protocol ...