如何使用多字节分隔符将文本文件读入GNU R?

时间:2011-10-25 01:51:09

标签: r csv

我可以使用read.csv或read.csv2将数据读入R.但我遇到的问题是我的分隔符是一个多字节字符串而不是一个字符。我怎么处理这个?

2 个答案:

答案 0 :(得分:9)

提供示例数据会有所帮助。但是,您可以根据自己的需要调整以下内容。

我创建了一个示例数据文件,它只是一个包含以下内容的文本文件:

1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3
1sep2sep3

我把它保存为'test.csv'。分隔字符是'sep'字符串。我认为read.csv()使用scan(),只接受sep的单个字符。要解决它,请考虑以下事项:

dat <- readLines('test.csv')
dat <- gsub("sep", " ", dat)
dat <- textConnection(dat)
dat <- read.table(dat)

readLines()只读取。gsub替换单个' '的多字符分隔字符串,或任何方便您的数据。然后textConnection()read.data()方便地读取所有内容。对于较小的数据集,这应该没问题。如果您有非常大的数据,请考虑使用类似AWK的预处理来替换多字符分隔字符串。以上内容来自http://tolstoy.newcastle.edu.au/R/e4/help/08/04/9296.html

更新 的 关于您的评论,如果您的数据中有空格,请使用其他替换分隔符。考虑将test.csv更改为:

1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3
1sep2 2sep3 

然后,使用以下功能:

readMulti <- function(x, sep, replace, as.is = T)
{
    dat <- readLines(x)
    dat <- gsub(sep, replace, dat)
    dat <- textConnection(dat)
    dat <- read.table(dat, sep = replace, as.is = as.is)

    return(dat)
}

尝试:

readMulti('test.csv', sep = "sep", replace = "\t", as.is = T)

在这里,您使用制表符(\t)替换原始分隔符。 as.is传递给read.table()以防止读入字符串是因素,但这是您的通话。如果您的数据中有更复杂的空格,您可能会发现quote中的read.table()参数有用,或者使用AWK,perl等进行预处理。

与crippledlambda strsplit()类似的东西很可能与中等大小的数据相同。如果性能成为问题,请尝试两者并查看哪些适合您。

答案 1 :(得分:4)

在这种情况下,您可以将textConnection(txt)替换为您的文件名,但基本上您可以围绕strsplit构建代码或函数。这里我假设你有一个标题行,但你当然可以定义一个header参数,并根据下面的函数推广数据框的创建:

read.multisep <- function(File,sep) {
    Lines <- readLines(File)
    Matrix <- do.call(rbind,strsplit(Lines, sep, fixed = TRUE))
    DataFrame <- structure(data.frame(Matrix[-1,]), names=Matrix[1,]) ## assuming header is present
    DataFrame[] <- lapply(DataFrame, type.convert)                    ## automatically convert modes
    DataFrame
}

example <- "a#*&b#*&c
            1#*&2#*&3
            4#*&5#*&6"

read.multisep(textConnection(example),sep="#*&")

  a b c
1 1 2 3
2 4 5 6