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吗?