Here is yet another solution. This is the simplest so far. Lines.raw is as before and the output is a 3 column character matrix.
section <- "" f <- function(x) { if (length(x) == 1) section <<- gsub("[\\[\\]]", "", x) if (length(x) <= 1) return() return(c(x, section)) } # Lines <- readLines("myfile.ini") Lines <- readLines(textConnection(Lines.raw)) do.call("rbind", lapply(strsplit(Lines, "="), f)) On 6/12/07, Gabor Grothendieck <[EMAIL PROTECTED]> wrote: > Here is yet another simplification. This one uses na.locf from the zoo > package to shorten it further and also make it easier to understand. > > Below we have one line to read in the .ini file, one line to transform the > characters [ and ] to = and =, the read.table line parses the result and > the next line carries forward the section names and removes the section > lines. Lines.raw is as before: > > library(zoo) > > # Lines <- readLines("myfile.ini") > Lines <- readLines(textConnection(Lines.raw)) > Lines2 <- chartr("[]", "==", Lines) > DF <- read.table(textConnection(Lines2), as.is = TRUE, sep = "=", fill = TRUE) > subset(transform(DF, V3 = na.locf(ifelse(V1 == "", V2, NA))), V1 != "") > > > On 6/12/07, Gabor Grothendieck <[EMAIL PROTECTED]> wrote: > > In thinking about this a bit more here is an even shorter solution where > > Lines.raw is as before: > > > > # Lines <- readLines("myfile.ini") > > Lines <- readLines(textConnection(Lines.raw)) > > Lines2 <- chartr("[]", "==", Lines) > > DF <- read.table(textConnection(Lines2), as.is = TRUE, sep = "=", fill = > > TRUE) > > L <- DF$V1 == "" > > subset(transform(DF, V3 = V2[which(L)[cumsum(L)]])[1:3], V1 != "") > > > > > > On 6/12/07, Gabor Grothendieck <[EMAIL PROTECTED]> wrote: > > > Here is some code. It replaces [ and ] with = sign and reads the result > > > into a data frame, DF. DF2 is similar except the section is now in V3. > > > DF3 is like like DF2 except sections are carried forward and finally > > > we remove the rows which only had sections. > > > > > > Lines.raw <- "[Section1] > > > var1=value1 > > > var2=value2 > > > [Section2] > > > A=value3 > > > B=value4 > > > " > > > > > > Lines <- readLines(textConnection(Lines.raw)) > > > Lines2 <- chartr("[]", "==", Lines) > > > DF <- read.table(textConnection(Lines2), as.is = TRUE, sep = "=", fill = > > > TRUE) > > > DF2 <- transform(DF, V3 = ifelse(V1 == "", V2, NA)) > > > L <- !is.na(DF2$V3) > > > DF3 <- transform(DF2, V3 = V3[c(NA, which(L))[cumsum(L)+1]]) > > > subset(DF3, V1 != "") > > > > > > The result is: > > > > > > V1 V2 V3 > > > 2 var1 value1 Section1 > > > 3 var2 value2 Section1 > > > 5 A value3 Section2 > > > 6 B value4 Section2 > > > > > > > > > On 6/12/07, Earl F. Glynn <[EMAIL PROTECTED]> wrote: > > > > I need to process some datasets where the configuration information was > > > > stored in .INI-like files, i.e., text files with sections like this: > > > > > > > > [Section1] > > > > var1=value1 > > > > var2=value2 > > > > [Section2] > > > > A=value3 > > > > B=value4 > > > > > > > > ... > > > > > > > > >From Google and other searches I haven't found any package, or function > > > > within a package, that reads .INI files into an R list, or other data > > > > structure. > > > > > > > > > > > > > > > > Any suggestions, or do I need to write my own? > > > > > > > > efg > > > > > > > > Earl F. Glynn > > > > Stowers Institute for Medical Research > > > > > > > > ______________________________________________ > > > > R-help@stat.math.ethz.ch 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. > > > > > > > > > > ______________________________________________ R-help@stat.math.ethz.ch 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.