R 删除基于分隔符的换行符
我有一个凌乱的、以|分隔的文件要清理。好的一行如下所示:R 删除基于分隔符的换行符,r,R,我有一个凌乱的、以|分隔的文件要清理。好的一行如下所示: 1,|some data|,|more data|,|some numbers| 1,|some data|,|more data|,|some numbers| 10,|some data|,|lots of text blah blah blah blah and more text sometimes text stretches across many lines|,|some numbers| 10,|some dat
1,|some data|,|more data|,|some numbers|
1,|some data|,|more data|,|some numbers|
10,|some data|,|lots of text blah
blah blah blah
and more text
sometimes text stretches across many lines|,|some numbers|
10,|some data|,|lots of text blah
blah blah blah
and more text
sometimes text stretches across many lines|,|some numbers|
1,|some data|,|more data|,|some numbers|
还有几条乱七八糟的线,在它们不属于的地方有换行符
10,|some data|,|lots of text blah
blah blah blah
and more text
sometimes text stretches across many lines|,|some numbers|
如图所示,列的数量在理论上是相同的,但数据杂乱无章,在不应该出现换行符的地方出现了换行符
我希望读入该文件,以便|之间的值都存储在数据帧中的同一个向量中
我当前正在使用读取文件
data <- read_delim("myfile.txt", delim = "|")
data <- data[, c(-1, -3, -5)] #to remove the columns just containing commas
但这给了我很多分析错误的行
我想告诉R我想在6号之前删除所有换行符。有没有关于如何做到这一点,或者如何以任何其他方式阅读这个凌乱的文件的想法
我要补充的是,该文件非常大,手动整理不是一个选项。您的数据似乎遵循以下几种模式: 柱分离器为,|或|| 行分隔符为| \n条,后跟换行符 \n可能随机出现在列中间 如果您可以识别此类模式,则可以逐步处理文件,以便将其转换为更常见的csv格式:
library(dplyr)
data <- readr::read_file("file.txt") %>% # read the file as a string
str_replace_all(",\\||\\|,\\|", ",") %>% # replace all column separators with commas
str_replace_all("\n", "") %>% # replace all newlines with empty strings
str_replace_all("\\|", "\n") %>% # replace all remaining bars with newlines
read.csv(text = ., header = FALSE) # read the .csv string into a data frame
到以下数据帧:
V1 V2 V3 V4
1 1 some data more data some numbers
2 10 some data lots of text blah blah blah blah and more text sometimes text stretches across many lines some numbers
3 10 some data lots of text blah blah blah blah and more text sometimes text stretches across many lines some numbers
4 1 some data more data some numbers
您的数据似乎遵循以下几种模式: 柱分离器为,|或|| 行分隔符为| \n条,后跟换行符 \n可能随机出现在列中间 如果您可以识别此类模式,则可以逐步处理文件,以便将其转换为更常见的csv格式:
library(dplyr)
data <- readr::read_file("file.txt") %>% # read the file as a string
str_replace_all(",\\||\\|,\\|", ",") %>% # replace all column separators with commas
str_replace_all("\n", "") %>% # replace all newlines with empty strings
str_replace_all("\\|", "\n") %>% # replace all remaining bars with newlines
read.csv(text = ., header = FALSE) # read the .csv string into a data frame
到以下数据帧:
V1 V2 V3 V4
1 1 some data more data some numbers
2 10 some data lots of text blah blah blah blah and more text sometimes text stretches across many lines some numbers
3 10 some data lots of text blah blah blah blah and more text sometimes text stretches across many lines some numbers
4 1 some data more data some numbers
进一步遵循@thelatemale的想法,我们可以使用readLines并使用粘贴将其折叠成一个字符串 然后我们应用strsplit两次。首先,在字符串的行号处拆分字符串,它们会丢失,但我假设它们是连续的。其次,将列表中的字符串拆分为|,|,并使用trinws清理一点。终于找到了
txt <- paste(readLines(con="R/messy.txt"), collapse=" ")
rr <- el(strsplit(txt, "\\b\\d*\\,\\|"))[-1]
rr <- strsplit(trimws(rr, whitespace="[\\|| ]"), "|,|", fixed=TRUE)
res <- as.data.frame(do.call(rbind, rr))
messy.txt
进一步遵循@thelatemale的想法,我们可以使用readLines并使用粘贴将其折叠成一个字符串 然后我们应用strsplit两次。首先,在字符串的行号处拆分字符串,它们会丢失,但我假设它们是连续的。其次,将列表中的字符串拆分为|,|,并使用trinws清理一点。终于找到了
txt <- paste(readLines(con="R/messy.txt"), collapse=" ")
rr <- el(strsplit(txt, "\\b\\d*\\,\\|"))[-1]
rr <- strsplit(trimws(rr, whitespace="[\\|| ]"), "|,|", fixed=TRUE)
res <- as.data.frame(do.call(rbind, rr))
messy.txt
最简单的解决办法似乎是
library(readr)
read_delim("file.txt", delim = ",", quote = "|", col_names = F)
其中quote告诉read_delim向量的开始和结束,即使它在源文件的多行上。delim参数指定由|表示的字符串用逗号分隔
它也适用于read.delim
和数据。表的fread为最大速度
library(data.table)
fread("file.txt", sep = ",", quote = "|", header = F)
资料
file.txt
结果
最简单的解决办法似乎是
library(readr)
read_delim("file.txt", delim = ",", quote = "|", col_names = F)
其中quote告诉read_delim向量的开始和结束,即使它在源文件的多行上。delim参数指定由|表示的字符串用逗号分隔
它也适用于read.delim
和数据。表的fread为最大速度
library(data.table)
fread("file.txt", sep = ",", quote = "|", header = F)
资料
file.txt
结果
我们说的文件有多大?你能读懂所有的文字,然后做一个文字替换,还是太大了?e、 这个文件大约是500mb,或者大约320万行,包括杂乱的行。我们说的是一个多大的文件?你能读懂所有的文字,然后做一个文字替换,还是太大了?e、 g.txt该文件约为500mb,或约320万行,包括凌乱的行。读_delimfile.txt,delim=,,quote=,col_names=F也可以吗?我刚刚在某个地方读到,这是读取这些文件的一种方式。@TeaTree是的,这似乎有效!多简洁的解决方案啊。读_delimfile.txt,delim=,quote=,col_names=F也行吗?我刚刚在某个地方读到,这是读取这些文件的一种方式。@TeaTree是的,这似乎有效!这是一个多么简洁的解决方案。这也适用于plain old read.delim吗?这也适用于plain old read.delim吗?