Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用R读取文本字段中包含无引号换行符的文件_Regex_R_Newline_Read.table - Fatal编程技术网

Regex 使用R读取文本字段中包含无引号换行符的文件

Regex 使用R读取文本字段中包含无引号换行符的文件,regex,r,newline,read.table,Regex,R,Newline,Read.table,我试图将一个大表读入R,但其中一个文本字段偶尔包含一个或多个未引用、未转义的换行符(\n),因此read.table()函数无法轻松导入此文件。文件以管道分隔,文本字段不带引号 如果我用read.table()传递参数fill=T,我可以读入它,但是,当然,文本字段中带有换行符的行会因此而损坏 我已经成功地使用了F100MB,所以gsub()只不过是把我的笔记本电脑变成了一个暖手器(在我写这篇文章时,它仍在尝试gsub所有的换行符) 有人对如何有效地读取这样的文件有什么建议吗 似乎应该有某种方法

我试图将一个大表读入R,但其中一个文本字段偶尔包含一个或多个未引用、未转义的换行符(
\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)