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