Regex 是否可以更改分隔符中的记录分隔符?

Regex 是否可以更改分隔符中的记录分隔符?,regex,r,delimiter,Regex,R,Delimiter,从文本文件读入数据(即read.table)时,是否可以操作记录/观察/行分隔符?使用sep=“”调整字段分隔符很简单,但我还没有找到一种方法来更改行尾字符的记录分隔符 我正在尝试读取管道分隔的文本文件,其中许多条目是包含回车的长字符串。R将这些CR视为行尾,行尾错误地开始了新行,并使记录数和字段顺序混乱 我希望使用不同的分隔符而不是CR。事实证明,每一行都以相同的字符串开头,因此,如果我可以使用类似于\n字符串的内容来标识真正的行尾,则表将正确导入。下面是一个简化的示例,说明其中一个文本文件的

从文本文件读入数据(即read.table)时,是否可以操作记录/观察/行分隔符?使用sep=“”调整字段分隔符很简单,但我还没有找到一种方法来更改行尾字符的记录分隔符

我正在尝试读取管道分隔的文本文件,其中许多条目是包含回车的长字符串。R将这些CR视为行尾,行尾错误地开始了新行,并使记录数和字段顺序混乱

我希望使用不同的分隔符而不是CR。事实证明,每一行都以相同的字符串开头,因此,如果我可以使用类似于\n字符串的内容来标识真正的行尾,则表将正确导入。下面是一个简化的示例,说明其中一个文本文件的外观

V1,V2,V3,V4
String,A,5,some text
String,B,2,more text and
more text
String,B,7,some different text
String,A,,
应读入R作为

V1      V2       V3      V4
String  A        5       some text
String  B        2       more text and more text
String  B        7       some different text
String  A        N/A     N/A

我可以在文本编辑器中打开这些文件,并在读入之前用find/replace清理它们,但是在R中有一个系统化的解决方案会很好。谢谢你的帮助。

我们可以在中阅读它们,然后将它们折叠起来。g的值为0表示标题,1表示下一行(以及后续行,如果有),依此类推
TAPLY
根据
g
给出
L2
折叠行,最后我们重新阅读行:

Lines <- "V1,V2,V3,V4
String,A,5,some text
String,B,2,more text and
more text
String,B,7,some different text
String,A,,"

L <- readLines(textConnection(Lines))

g <- cumsum(grepl("^String", L))
L2 <- tapply(L, g, paste, collapse = " ")

DF <- read.csv(text = L2, as.is = TRUE)
DF$V4[ DF$V4 == "" ] <- NA

Lines如果你在Linux/Mac上,你应该真正使用命令行工具,比如
sed
。以下是两种略有不同的方法:

# keep the \n
read.csv(pipe('sed \'N; s/\\([^,]*\\)\\n\\([^,]*$\\)/"\\1\\n\\2"/\' test.txt'))
#      V1 V2 V3                       V4
#1 String  A  5                some text
#2 String  B  2 more text and\nmore text
#3 String  B  7      some different text
#4 String  A NA

# get rid of the \n and replace with a space
read.csv(pipe('sed \'N; s/\\([^,]*\\)\\n\\([^,]*$\\)/\\1 \\2/\' test.txt'))
#      V1 V2 V3                      V4
#1 String  A  5               some text
#2 String  B  2 more text and more text
#3 String  B  7     some different text
#4 String  A NA

但是,您会如何更改记录分隔符呢?它不一致,需要以某种方式清理。如果这是您所拥有的全部内容,那么您可以将其作为原始未格式化文本读入,搜索不以“String”开头的行,并将其附加到前一行,然后发送到read.table进行格式化。但这真的是所有需要修复的问题吗?是的,这可能是正确的看法。无论如何,一个更好的方法。这基本上就是GG的解决方案所做的,对吗?
# keep the \n
read.csv(pipe('sed \'N; s/\\([^,]*\\)\\n\\([^,]*$\\)/"\\1\\n\\2"/\' test.txt'))
#      V1 V2 V3                       V4
#1 String  A  5                some text
#2 String  B  2 more text and\nmore text
#3 String  B  7      some different text
#4 String  A NA

# get rid of the \n and replace with a space
read.csv(pipe('sed \'N; s/\\([^,]*\\)\\n\\([^,]*$\\)/\\1 \\2/\' test.txt'))
#      V1 V2 V3                      V4
#1 String  A  5               some text
#2 String  B  2 more text and more text
#3 String  B  7     some different text
#4 String  A NA