提供示例数据会有所帮助。不过,您或许可以根据自己的需要调整以下内容。
我创建了一个示例数据文件,它只是一个包含以下内容的文本文件:
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() 以防止字符串被读入是因素,但这是你的电话。如果您的数据中有更复杂的空白,您可能会发现 read.table() 中的 quote 参数很有帮助,或者使用 AWK、perl 等进行预处理。
与 crippledlambda 的 strsplit() 类似的东西很可能等效于中等大小的数据。如果性能成为问题,请尝试两种方法,看看哪种方法适合您。