[R] Parsing

Paolo Sonego paolo.sonego at gmail.com
Wed Jul 9 16:57:27 CEST 2008


Thanks so much Jim! It works without a glitch!
My only problem is that the text files to be parsed are quite big, up to 
several thousands rows (my apologies for the incomplete informations in 
my former post), so loops are not my first choice. I'll take a look at 
'lapply' using your code as a model. Thanks again!

Sincerely,
Paolo

jim holtman ha scritto:
> This should do what you want: (it uses loops; you can work at
> replacing those with 'lapply' and such -- it all depends on if it is
> going to take you more time to rewrite the code than to process a set
> of data; you never did say how large the data was).  This also "grows"
> a data.frame, but you have not indicated how efficient is has to be.
> So this could be used as a model.
>
>   
>> x <- readLines(textConnection("x      x_string
>>     
> + y      y_string
> + id1    id1_string
> + id2    id2_string
> + z      z_string
> + w      w_string
> + stuff  stuff  stuff
> + stuff  stuff  stuff
> + stuff  stuff  stuff
> + //
> + x      x_string1
> + y      y_string1
> + z      z_string1
> + w      w_string1
> + stuff  stuff  stuff
> + stuff  stuff  stuff
> + stuff  stuff  stuff
> + //
> + x      x_string2
> + y      y_string2
> + id1    id1_string1
> + id2    id2_string1
> + z      z_string2
> + w      w_string2
> + stuff  stuff  stuff
> + stuff  stuff  stuff
> + stuff  stuff  stuff
> + //"))
>   
>> # I assume that each group is delimited by "//"
>> # initialize data.frame with desired values
>> .keys <- data.frame(x=NA, y=NA, id1=NA, id2=NA, w=NA)
>> .out <- .keys  # for the first pass
>> .save <- NULL
>> for (i in seq_along(x)){
>>     
> +     if (x[i] == "//"){  # output the current data
> +         .save <- rbind(.save, .out)
> +         .out <- .keys    # setup for the next pass
> +     } else {
> +         .split <- strsplit(x[i], "\\s+")
> +         if (.split[[1]][1] %in% names(.out)){
> +             .out[[.split[[1]][1]]] <- .split[[1]][2]
> +         }
> +     }
> + }
>   
>> .save
>>     
>           x         y         id1         id2         w
> 1  x_string  y_string  id1_string  id2_string  w_string
> 2 x_string1 y_string1        <NA>        <NA> w_string1
> 3 x_string2 y_string2 id1_string1 id2_string1 w_string2
>
>
> On Wed, Jul 9, 2008 at 5:33 AM, Paolo Sonego <paolo.sonego a gmail.com> wrote:
>   
>> Dear R users,
>>
>> I have a big text file formatted like this:
>>
>> x      x_string
>> y      y_string
>> id1    id1_string
>> id2    id2_string
>> z      z_string
>> w      w_string
>> stuff  stuff  stuff
>> stuff  stuff  stuff
>> stuff  stuff  stuff
>> //
>> x      x_string1
>> y      y_string1
>> z      z_string1
>> w      w_string1
>> stuff  stuff  stuff
>> stuff  stuff  stuff
>> stuff  stuff  stuff
>> //
>> x      x_string2
>> y      y_string2
>> id1    id1_string1
>> id2    id2_string1
>> z      z_string2
>> w      w_string2
>> stuff  stuff  stuff
>> stuff  stuff  stuff
>> stuff  stuff  stuff
>> //
>> ...
>> ...
>>
>>
>> I'd like to parse this file and retrieve the x, y, id1, id2, z, w fields and
>> save them into a a matrix object:
>>
>> x        y          id1         id2         z          w
>> x_string y_string   id1_string  id2_string  z_string   w_string  x_string1
>> y_string1 NA          NA          z_string1  w_string1
>> x_string2 y_string2 id1_string1 id2_string1 z_string2  w_string2
>> ...
>> ...
>>
>> id1, id2 fields  are not always present within a section (the interval
>> between x and the last stuff) and
>> I'd like to insert a NA when they are absent (see above) so that
>> length(x)==length(y)==length(id1)==... .
>>
>> Without the id1, id2 fields the task is easily solvable  importing the text
>> file with readLines and retrieving the single fields with grep:
>>
>> input = readLines("file.txt")
>> x = grep("^x\\s", input, value = T)
>> id1 = grep("^id1\\s", input, value = T)
>> ...
>>
>> I'd like to accomplish this task entirely in R (no SQL, no perl script),
>>  possibly without using loops.
>>
>> Any suggestions are quite welcome!
>>
>> Regards,
>> Paolo
>>
>> ______________________________________________
>> R-help a r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>>     
>
>
>
>



More information about the R-help mailing list