非标准字符使我无法读取R

时间:2018-07-26 16:52:29

标签: r import read.csv

我的csv文件(可通过链接访问,也可通过屏幕截图查看)有8个观察结果。 Obs#5在“作者”列中具有非标准字符。我把这个阴影涂成黄色。

https://docs.google.com/spreadsheets/d/1-douIz03OQqahG6WCWY-irOE52oXtDDc4fJ6myMwJDk/edit?usp=sharing

enter image description here

当我运行以下命令时:

  

data1 <-read.csv(“ Book1.csv”,colClasses = c(“ end_date_n” =“字符”,“ start_date_n” =“字符”),stringsAsFactors = FALSE)

我收到此警告消息,并且仅导入了前4行和部分第5行。导入会在第5列中出现非标准字符的位置停止。

  

在scan(file = file,what = what,sep = sep,quote = quote,dec = dec,   :EOF用引号引起来

当我从csv源文件中删除“作者”列时,导入工作正常。

如何在不删除问题列的情况下导入完整文件?

1 个答案:

答案 0 :(得分:0)

一位同事想出了这个解决方案:

“原始字符是^ z,几十年来一直被DOS / Windows用作文件标记的结尾。由于UNIX系统从未使用过^ z,因此读入问题是Windows特定的。Windows系统通常会指导用户使用“ ALT”代码输入非ASCII字符(如é)。这可能是^ z的起源。”

“使用实用程序将^ z转换为无害的内容。下面的killZ函数将文件名转换为*,然后将结果写入与原始文件相同的目录中,但插入了-noz .txt或.csv(或其他)文件类型之前。然后,您可以按照读取原始.txt或.csv文件的相同方式来读取-noz文件。”

killZ <- function(fname) {
  # open in binary mode
  f <- file(fname, "rb")
  res <- readLines(f)
  # translate the ^Z to *
  res <- gsub("\032", "*", res, fixed = TRUE)
  # Create the new file name
  ftype <- stringr::str_extract(fname, "\\..{1,3}$")
  new_name <- paste0(gsub(ftype, "", fname), "-noz", ftype)
  writeLines(res, con = new_name)
  close(f)
  return(new_name)
}