Summary: [R] How to represent pure linefeeds chr(10) under R for Windows

Jens Oehlschlägel joehl at gmx.de
Thu Nov 6 20:41:16 CET 2003


Thanks to all who have responded.
My concern was to be able to write a csv file that can have line feeds in
string columns chr(10).
Why? Excel allows line feeds chr(10) within cells and line breaks
chr(13)+chr(10) at line ending, 
but the windows version of R automatically replaces \n by \r\n in writing
and \r\n by \n in reading (text mode).

The clues for a solution came from Brian Ripley and Thomas Lumley: we need
to use "binary"  connection mode (will not replace \n by \r\n) and explicit
specification of line ending as "\r\n".
Testing with these gave the following results:

## write.table / read.table: a bit inconsistent: need text connection to
read and binary connection to write
## writeLines / readLines: readLines misses a sep= parameter to properly
read in such data
## writeChar / readChar: OK

Thanks again and
Best regards


Jens Oehlschägel



## Details

filename <- "c:/tmp/c2.csv"


## write.table / read.table: a bit inconsistent: need binary connection to
read and text connection to write

data <- data.frame(a='c\nd', b='"äöüÄÖÜß"')

# writing in text mode replaces \n by \r\n
file <- file(filename, "w")
write.table(data, row.names=FALSE, file=file, sep=";", qmethod="double")
close(file)

# writing in binary mode does not replace \n, however the real line endings
are also \n instead of \r\n
file <- file(filename, "wb")
write.table(data, row.names=FALSE, file=file, sep=";", qmethod="double")
close(file)

# using the eol parameter we can create the desired csv format (which can be
read by Excel
file <- file(filename, "wb")
write.table(data, row.names=FALSE, file=file, sep=";", qmethod="double",
eol="\r\n")
close(file)


# for the read test write a dataset that avoids a reported bug in
read.table()
data <- data.frame(a=c(rep("x", 5), "c\nd"), b=c(rep("y", 5), '"äöüÄÖÜß"'))
file <- file(filename, "wb")
write.table(data, row.names=FALSE, file=file, sep=";", qmethod="double",
eol="\r\n")
close(file)

# read astonishingly works on char mode connection
file <- file(filename, "r")
read.csv2(file)
close(file)

# and doesn't work on binary connection
file <- file(filename, "rb")
read.csv2(file)
close(file)



## writeLines / readLines: readLines misses a sep= parameter to properly
read in such data
data <- c('a;b', 'c\nd;"äöüÄÖÜß"')

# text mode substitutes \n -> \r\n like in write.table
file <- file(filename, "w")
writeLines(data, file, sep="\n")
close(file)

# we can write out the desired one using binary mode and sep="\r\n"
file <- file(filename, "wb")
writeLines(data, file, sep="\r\n")
close(file)

# However, we cannot read this in in binary mode, readLines misses a sep=
parameter
file <- file(filename, "rb")
readLines(file)
close(file)

# text mode replaces as expected
file <- file(filename, "r")
readLines(file)
close(file)



## writeChar / readChar: OK
data <- c('a;b\r\nc\nd;"äöüÄÖÜß"')

# writing text mode substitutes as expected
file <- file(filename, "w")
writeChar(data, file, eos=NULL)
close(file)

# writing binary mode works
file <- file(filename, "wb")
writeChar(data, file, eos=NULL)
close(file)

# reading binary mode works
file <- file(filename, "rb")
readChar(file, nchar(data))
close(file)

# reading text mode substitutes as expected
file <- file(filename, "r")
readChar(file, nchar(data))
close(file)



--




More information about the R-help mailing list