[R] Read Windows-like .INI files into R data structure?

Gabor Grothendieck ggrothendieck at gmail.com
Thu Jun 14 06:04:56 CEST 2007


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 <ggrothendieck at gmail.com> 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 <ggrothendieck at gmail.com> 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 <ggrothendieck at gmail.com> 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 <efg at stowers-institute.org> 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 at 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.
> > > >
> > >
> >
>



More information about the R-help mailing list