从文本文件中读取数据(即read.table)时是否可以操作记录/观察/行分隔符?使用sep =“”调整字段分隔符很简单,但是我还没有找到一种方法来从行尾字符更改记录分隔符。
我正在尝试读取管道分隔的文本文件,其中许多条目都是包含回车符的长字符串。 R将这些CR视为行尾,这会错误地开始新行并且会增加记录和字段顺序的数量。
我想使用不同的分隔符而不是CR。事实证明,每一行都以相同的字符串开头,所以如果我可以使用像\ nString这样的东西来识别 true 行尾,那么表格就会正确导入。这是一个文本文件可能是什么样的简化示例。
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中的系统解决方案会很棒。谢谢你的帮助。
答案 0 :(得分:3)
我们可以阅读它们然后将它们折叠起来。 g将为标题设置值0,为下一行设置1(对于后续行,如果有的话),依此类推。 tapply
根据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
这给出了:
> DF
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 <NA>
答案 1 :(得分:0)
如果您使用的是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