Regex 使用R读取文本字段中包含无引号换行符的文件
我试图将一个大表读入R,但其中一个文本字段偶尔包含一个或多个未引用、未转义的换行符(Regex 使用R读取文本字段中包含无引号换行符的文件,regex,r,newline,read.table,Regex,R,Newline,Read.table,我试图将一个大表读入R,但其中一个文本字段偶尔包含一个或多个未引用、未转义的换行符(\n),因此read.table()函数无法轻松导入此文件。文件以管道分隔,文本字段不带引号 如果我用read.table()传递参数fill=T,我可以读入它,但是,当然,文本字段中带有换行符的行会因此而损坏 我已经成功地使用了F100MB,所以gsub()只不过是把我的笔记本电脑变成了一个暖手器(在我写这篇文章时,它仍在尝试gsub所有的换行符) 有人对如何有效地读取这样的文件有什么建议吗 似乎应该有某种方法
\n
),因此read.table()
函数无法轻松导入此文件。文件以管道分隔,文本字段不带引号
如果我用read.table()
传递参数fill=T
,我可以读入它,但是,当然,文本字段中带有换行符的行会因此而损坏
我已经成功地使用了F100MB,所以gsub()
只不过是把我的笔记本电脑变成了一个暖手器(在我写这篇文章时,它仍在尝试gsub所有的换行符)
有人对如何有效地读取这样的文件有什么建议吗
似乎应该有某种方法告诉R在等待换行符之前等待一定数量的分隔符,但我在文档中找不到任何方法来做到这一点
抱歉,这看起来应该很容易,但这真的让我很困惑,我还没有在stackoverflow或google中找到任何解决方案
以下是我迄今为止尝试过的代码:
尝试1:
fdat = read.table(file=fname,
allowEscapes=F,
stringsAsFactors=F,
quote="",
fill=T,
strip.white=T,
comment.char="",
header=T,
sep="|")
尝试2:
f <- readChar(fname, nchars=file.info(fname)["size"], TRUE)
f2 = gsub(pattern="\n(?!NCT)",replacement=" ",x=f, perl=T)
fdat = read.table(text=f2,
allowEscapes=F,
stringsAsFactors=F,
quote="",
fill=F,
strip.white=T,
comment.char="",
header=T,
sep="|")
可以看到,我的问题文件中的示例行包括标题(第1行)、问题行(第2行)和非问题行(第3行)。每个非标题行以NCT开头,以\n结尾(这在gsub的正则表达式中得到了利用)
非常感谢您的任何建议。似乎没有办法使用read.table
解决此问题。不幸的是,它不允许像awk那样更改“记录分隔符”
尝试2失败,因为DOS格式换行符是\r\n(0x0d 0x0a),并且只有\n与gsub
匹配。假设您有以下文件:
NCTa|b|c
NCT1|how
are
you?|well
NCT2|are
you
sure?|yes
然后查看第二个命令的输出:
f2 <- gsub(pattern="\n(?!NCT)",replacement=" ",x=f, perl=TRUE)
f2
# [1] "NCTa|b|c\r\nNCT1|how\r are\r you?|well\r\nNCT2|are\r you\r sure?|yes\r "
它会起作用的
关于性能,您可以尝试readChar
在一个循环中通过较小的块来读取它,gsub
将它们写回文件,然后read.table
读取它。这只是一个想法。知道正则表达式模式不能在dos下正常工作是很有趣的;除了执行时间外,它在我的mac电脑上运行良好。
f2 <- gsub(pattern="\n(?!NCT)",replacement=" ",x=f, perl=TRUE)
f2
# [1] "NCTa|b|c\r\nNCT1|how\r are\r you?|well\r\nNCT2|are\r you\r sure?|yes\r "
f2 <- gsub(pattern="\r?\n(?!NCT)",replacement=" ",x=f, perl=TRUE)