fread()以方括号外的逗号作为分隔符

时间:2019-02-25 13:17:40

标签: r data.table export-to-csv fread

我正在尝试使用fread()从网站上获取一些数据。使用逗号分隔符方便地设置数据,但出现错误:

1: In fread("https://website.com/") :
Stopped early on line 56. Expected 5 fields but found 6. Consider fill=TRUE and comment.char=. First discarded non-empty line: <<0,1,1,x[[0], [1]],0>>

这是因为第56行之前的条目在第4列上有一个空白,因此类似<<1,1,1,0>>,而第56行在第4列上有一个包含逗号的内容,因此将其分为两列。现在,我希望整个x[[y], [z]]放在一个单元格中,所以我希望我的数据用逗号分隔,但是当逗号放在方括号内时,则不要。

编辑:真实的网站是私有网站,因此在此处链接它没有任何意义,而只是包含csv格式的数据。像这样:

field1,field2,field3,field4,field5
1,0,0,,1
0,0,0,,1
1,1,0,,1
1,1,0,,1
............
0,1,1,x[[0], [1]],0
0,1,0,x[[0], [1]],1
1,0,1,,1
0,0,1,x[[1], [0]],0
............

问题是由于x[[0], [1]]应该全部位于一个单元格中,但是由于逗号分隔符,它分成了两个单元格。

是否可以通过fread()?或具有类似目的的其他任何功能来做到这一点?

预先感谢您,如果问题有点基本,我刚刚开始使用R。

2 个答案:

答案 0 :(得分:1)

建议:

从文档中:

'fread' is for regular delimited files; i.e., where every row has the same number of
columns.

如果由于文件生成错误而导致列数变化或不规则,则使用readLines之类的替代方法可以逐行处理文件-也许可以使用gsub之类的正则表达式等

答案 1 :(得分:1)

您可以先下载CSV,然后再下载:

,而不是直接使用fread从您的私有网站中读取CSV文件。
  1. 读取CSV的行(无需任何特殊解析),这相当于我的csv_lines <- read_lines(my_weird_csv_text);
  2. 然后,根据正则表达式"(?!\\])(\\,)(?!\\s\\[)"拆分这些读取行,而不是使用单个逗号","(这可以确保在这些表达式中使用"[[""]]"逗号不能用作拆分字符);
  3. 最后,从结果矩阵的第一行(split_lines)定义从split_lines开始强制执行的新数据帧/小标题的列名。

我希望这很清楚。

基本上,我们必须逐行读取,然后基于处理特殊情况的正则表达式进行拆分,从而规避fread等类似的直接读取功能。

library(readr)
library(data.table)
library(stringr)
library(tibble)

my_weird_csv_text <- 
"field1,field2,field3,field4,field5
1,0,0,,1
0,0,0,,1
1,1,0,,1
1,1,0,,1
0,1,1,x[[0], [1]],0
0,1,0,x[[0], [1]],1
1,0,1,,1
0,0,1,x[[1], [0]],0"

csv_lines <- read_lines(my_weird_csv_text)

split_lines <- stringr::str_split(csv_lines, "(?!\\])(\\,)(?!\\s\\[)", simplify = TRUE)

as_tibble(split_lines[-1, ]) %>%
  `colnames<-`(split_lines[1, ]) -> tbl

tbl
#> # A tibble: 8 x 5
#>   field1 field2 field3 field4      field5
#>   <chr>  <chr>  <chr>  <chr>       <chr> 
#> 1 1      0      0      ""          1     
#> 2 0      0      0      ""          1     
#> 3 1      1      0      ""          1     
#> 4 1      1      0      ""          1     
#> 5 0      1      1      x[[0], [1]] 0     
#> 6 0      1      0      x[[0], [1]] 1     
#> 7 1      0      1      ""          1     
#> 8 0      0      1      x[[1], [0]] 0