read_tsv()使R崩溃,但仅限于数据文件

b1zrtrql  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(120)

我试图通过文本文件从网站下载数据,然后使用以下代码通过read_tsv将其加载到R中:

url_jobzones <-
"https://www.onetcenter.org/dl_files/database/db_27_3_text/Job%20Zones.txt"

jobzones_file_name <- "jobzones.txt"

download.file(url_jobzones, destfile= paste("data/EdExTrain", jobzones_file_name, sep="/"))

这三行代码工作正常,文本文件在Windows上打开也正常,但运行以下代码行将导致致命错误并使RStudio崩溃:

> jobzones <- read_tsv("data/EdExTrain/jobzones.txt")

有什么建议吗?
对于其他上下文,在该网站上的其他文件上运行类似的代码不会导致错误并且工作得很好:

url_skills <- "https://www.onetcenter.org/dl_files/database/db_27_3_text/Skills.txt"

skills_file_name <- "skills.txt"

download.file(url_skills, destfile= paste("data/KSAs", skills_file_name, sep="/"))

skills <- read_tsv("data/KSAs/skills.txt")

事实上,该网站上出现的大多数文本文件的大多数相同代码不会导致错误(https://www.onetcenter.org/database.html#individual-files)
唯一让它崩溃的文件是:

  • 工作区域
  • 对RIASEC的基本利益
  • 使用的工具
  • DWA的任务
  • 报告标题样本
  • 工作活动能力

任何和所有的投入将是最受欢迎的。很高兴发布我正在使用的完整代码,如果这将是有用的(总共242行,大部分是复制/粘贴格式,就像你上面看到的那样)。先谢谢你。

iyr7buue

iyr7buue1#

不知道为什么它会崩溃而不是抛出错误(*),但是如果不使用wb模式,Windows上的download.file()会在文本传输过程中修改行尾,这会使解析器感到困惑,特别是对于具有\r\n(回车+换行符)行尾的文本文件,因为这些文件会转换为\r\r\n,所以行数会增加一倍,每两行为空。你可以用一些编辑器来检查下载的文件,这些编辑器有很好的非打印字符显示(例如Notepad ++)和/或对从文件读取的字符串使用print()/stringr::str_view()来调试此类情况:

library(stringr)
library(readr)

url_txt_nok <- "https://www.onetcenter.org/dl_files/database/db_27_3_text/Job%20Zones.txt"

dl_txt <- function(url_, ...){
  tmp_txt <- tempfile(fileext = ".txt")
  download.file(url_, destfile = tmp_txt, ...)
  tmp_txt
}

# download.file without mode = "wb", existing \r\n line endings are converted to \r\r\n
txt_nok_mode_def <- dl_txt(url_txt_nok)
# escape all non-ASCII chars to display all non-printing characters, including \n
read_file(txt_nok_mode_def) |> str_trunc(200) |> str_view(use_escapes = TRUE)
#> [1] │ O*NET-SOC Code\tJob Zone\tDate\tDomain Source\r\r\n11-1011.00\t5\t07/2014\tAnalyst\r\r\n11-1011.03\t5\t08/2021\tAnalyst\r\r\n11-1021.00\t4\t07/2015\tAnalyst\r\r\n11-1031.00\t4\t06/2008\tAnalyst\r\r\n11-2011.00\t4\t08/2018\tAnalyst...
read_file(txt_nok_mode_def) |> str_trunc(200) |> str_view()
#> [1] │ O*NET-SOC Code{\t}Job Zone{\t}Date{\t}Domain Source{\r\r}
#>     │ 11-1011.00{\t}5{\t}07/2014{\t}Analyst{\r\r}
#>     │ 11-1011.03{\t}5{\t}08/2021{\t}Analyst{\r\r}
#>     │ 11-1021.00{\t}4{\t}07/2015{\t}Analyst{\r\r}
#>     │ 11-1031.00{\t}4{\t}06/2008{\t}Analyst{\r\r}
#>     │ 11-2011.00{\t}4{\t}08/2018{\t}Analyst...
read_lines(txt_nok_mode_def)[1:5]
#> [1] "O*NET-SOC Code\tJob Zone\tDate\tDomain Source"
#> [2] ""                                             
#> [3] "\n11-1011.00\t5\t07/2014\tAnalyst"            
#> [4] ""                                             
#> [5] "\n11-1011.03\t5\t08/2021\tAnalyst"

# download.file with mode = "wb"
txt_nok_mode_wb  <- dl_txt(url_txt_nok, mode ="wb")
read_file(txt_nok_mode_wb) |> str_trunc(200) |> str_view(use_escapes = TRUE)
#> [1] │ O*NET-SOC Code\tJob Zone\tDate\tDomain Source\r\n11-1011.00\t5\t07/2014\tAnalyst\r\n11-1011.03\t5\t08/2021\tAnalyst\r\n11-1021.00\t4\t07/2015\tAnalyst\r\n11-1031.00\t4\t06/2008\tAnalyst\r\n11-2011.00\t4\t08/2018\tAnalyst\r\n11-...
read_file(txt_nok_mode_wb) |> str_trunc(200) |> str_view()
#> [1] │ O*NET-SOC Code{\t}Job Zone{\t}Date{\t}Domain Source{\r}
#>     │ 11-1011.00{\t}5{\t}07/2014{\t}Analyst{\r}
#>     │ 11-1011.03{\t}5{\t}08/2021{\t}Analyst{\r}
#>     │ 11-1021.00{\t}4{\t}07/2015{\t}Analyst{\r}
#>     │ 11-1031.00{\t}4{\t}06/2008{\t}Analyst{\r}
#>     │ 11-2011.00{\t}4{\t}08/2018{\t}Analyst{\r}
#>     │ 11-...
read_lines(txt_nok_mode_wb)[1:5]
#> [1] "O*NET-SOC Code\tJob Zone\tDate\tDomain Source"
#> [2] "11-1011.00\t5\t07/2014\tAnalyst"              
#> [3] "11-1011.03\t5\t08/2021\tAnalyst"              
#> [4] "11-1021.00\t4\t07/2015\tAnalyst"              
#> [5] "11-1031.00\t4\t06/2008\tAnalyst"

创建于2023 - 06 - 10带有reprex v2.0.2

  • )与read_tsv()不同,read.table()read_delim(delim = "\t")或多或少成功地处理了这个问题,前者作为line 2 did not have 7 elements失败,显然那些“空”行对于read.table()不是空的;后者处理空白行并且仅仅跳过那些,即内容被解析。

崩溃本身在我的终端也是可重现的,RStudio中的R会话被R Session Aborted \ R encountered a fatal error.\ The session was terminated.消息终止,当运行readr::read_tsv()RScript时,它会发生segfaults:

$ Rscript.exe -e 'sessionInfo(); download.file("https://www.onetcenter.org/dl_files/database/db_27_3_text/Job%20Zones.txt", destfile="jobzones.txt"); readr::read_tsv("jobzones.txt")'
R version 4.2.3 (2023-03-15 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 10 x64 (build 19045)
...
trying URL 'https://www.onetcenter.org/dl_files/database/db_27_3_text/Job%20Zones.txt'
Content type 'text/plain' length 28693 bytes (28 KB)
==================================================
downloaded 28 KB

Segmentation fault

相关问题