【问题标题】:fread() with commas outside square brackets as separatorsfread() 用方括号外的逗号作为分隔符
【发布时间】:2019-07-18 21:52:20
【问题描述】:

我正在尝试使用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 列有一个空白,所以类似于 &lt;&lt;1,1,1,0&gt;&gt;,而第 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。

【问题讨论】:

  • 请分享给出错误的实际代码。
  • @rmagno,感谢您的回答。我唯一的代码是 fread("website.com/"),因为如果我设法克服这个错误,它就可以完成工作。无论如何,该网站是私有的,所以我无法在这里链接真实的,但它只是一个包含数据的页面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 问题在于 x[[0], [1]] 应该是全部在一个单元格中,但由于逗号分隔符,它被分成两个单元格。编辑:我实际上会把它放在主体中。
  • 也许您可以分享可下载文件的初始部分(包含触发错误的行)。
  • 我在问题主体中添加了文件中的行示例,希望现在更清楚。

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


【解决方案1】:

您可以先下载 CSV,然后:

  1. 读取CSV的行(无需任何特殊解析),将相当于我的csv_lines &lt;- read_lines(my_weird_csv_text)
  2. 然后,根据正则表达式 "(?!\\])(\\,)(?!\\s\\[)" 拆分这些读取的行,而不是使用单个逗号 ","(这可以确保带有 "[[""]]" 的表达式中的逗号不会用作拆分字符);
  3. 最后,从结果矩阵 (split_lines) 的第一行定义从 split_lines 强制转换的新数据框/tibble 的列名。

我希望它很清楚。

基本上,我们必须通过逐行读取然后根据处理您的特殊情况的正则表达式进行拆分来规避直接读取函数,例如 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

【讨论】:

    【解决方案2】:

    一个建议:

    来自文档:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 2021-05-16
      • 2012-12-22
      相关资源
      最近更新 更多