R 读取分隔文件,其中分号显示为分隔符和字符串

R 读取分隔文件,其中分号显示为分隔符和字符串,r,data.table,R,Data.table,我试图读取一个文件,其中一些行在文本字符串中包含额外的分号(我不知道是什么原因造成的) 例如,这是一个具有相同问题的超级简化数据: bad_data <- "100; Mc Donalds; Seattle; normal day 115; Starbucks; Boston; normal day 400; PF Chang; Chicago; busy day 400;; Texas; busy day

我试图读取一个文件,其中一些行在文本字符串中包含额外的分号(我不知道是什么原因造成的)

例如,这是一个具有相同问题的超级简化数据:

bad_data <- "100; Mc Donalds; Seattle; normal day
             115; Starbucks; Boston; normal day
             400; PF Chang; Chicago; busy day
             400;; Texas; busy day
             10; D;unkin Donuts; Washin;gton; lazy day"

但是没有雪茄。。。这是不可能读取的,如果没有干净的解决方案,我想跳过这些行。

如果您只想删除没有预期分隔符数的行:

library(stringi)
library(magrittr)

bad_data <- 
"100; Mc Donalds; Seattle; normal day
115; Starbucks; Boston; normal day
400; PF Chang; Chicago; busy day
400;; Texas; busy day
10; D;unkin Donuts; Washin;gton; lazy day"

# split to lines. you could also use readLines if it's coming from a file
text_lines <- unlist(strsplit(bad_data, '\n'))

# which lines contain the expected number of semicolons?
good_lines <- sapply(text_lines, function(x) stri_count_fixed(x, ';') == 3)

# for those lines, split to vectors and (optional bonus) trim whitespace
good_vectors <- lapply(
  text_lines[good_lines], 
  function(x) x %>% strsplit(';') %>% unlist %>% trimws)

# flatten to matrix (from which you can make a data.frame or whatever you want)
my_mat <- do.call(rbind, good_vectors)

您可以尝试删除文本字符串中的所有分号(假设所有不需要的分号都完全位于字符串中:

gsub("(\\S);(\\S)", "\\1\\2", bad_data, perl=TRUE)
[1] "100; Mc Donalds; Seattle; normal day\n             115; Starbucks; Boston; normal day\n             400; PF Chang; Chicago; busy day\n             400; Texas; busy day\n             10; Dunkin Donuts; Washington; lazy day"

(分号+空格)拆分?并非所有字段的分号后面都有空格:(你的意思是像德克萨斯条目一样缺少一个字段吗?还是一般来说?一般来说…真实的东西有26000000多行和更多列如果数据太大而无法放入内存,那么在命令行中使用
sed
或其他什么东西可能会更干净,但是上面的示例数据是有效的。)
> my_mat
     [,1]  [,2]         [,3]      [,4]        
[1,] "100" "Mc Donalds" "Seattle" "normal day"
[2,] "115" "Starbucks"  "Boston"  "normal day"
[3,] "400" "PF Chang"   "Chicago" "busy day"  
[4,] "400" ""           "Texas"   "busy day"  
gsub("(\\S);(\\S)", "\\1\\2", bad_data, perl=TRUE)
[1] "100; Mc Donalds; Seattle; normal day\n             115; Starbucks; Boston; normal day\n             400; PF Chang; Chicago; busy day\n             400; Texas; busy day\n             10; Dunkin Donuts; Washington; lazy day"