【问题标题】:read.csv - unknown character and embedded quotesread.csv - 未知字符和嵌入引号
【发布时间】:2014-02-07 08:47:35
【问题描述】:

我有一个 .csv,它会导致 read.table() 和 fread() 出现不同的问题。

有一个未知字符导致 read.table() 停止(让人想起 read.csv stops reading at row 523924 even thouhg the file has 799992 rows)。 Excel、记事本和 SAS System Viewer 将其呈现为向右箭头(尽管如果我使用 Excel 的插入符号插入 u2192,它看起来会有所不同); emacs 将其呈现为 ^Z。

fread() 越过了未知字符(将其作为 \032 引入),但还有另一个问题阻止了它成为我的问题的解决方案:数据集使用引号作为英寸的缩写,因此嵌入 (甚至不匹配)引号。

除了修改原始 .csv 文件(例如,通过全局替换奇怪的箭头)之外,有没有人有任何建议?

提前致谢!

【问题讨论】:

  • 此箭头是否多次出现,或者您可以导航到相应的字段,删除该字符然后加载文件吗?
  • 这个角色在众多文件中的每一个中都出现了无数次,每个文件都有接近 10^6 行 - 我目前正在着手搜索和替换任务,这将是耗时的.不过,我更担心的是,我将以一种未记录的方式修改输入。
  • 更新:我意识到这是一个控制(非打印)字符。在这个线程(stat.ethz.ch/pipermail/r-help/2009-February/thread.html#187276)上有两个想法:1)将文件作为原始字节读取,并将错误的控制字符替换为空; 2)使用类似perl(另一位记者建议的awk)在R中解析之前进行替换。我选择了后者使用vbs脚本。

标签: r csv data.table


【解决方案1】:

Paul's file 的情况下,我能够使用fread()cmd "unzip -cq"quote = "" 参数读取文件(经过一些实验),而不会出现错误或警告。我想这可能也适用于Kristian's file

在 Windows 上,可能需要预先安装 Rtools

library(data.table) # development version 1.14.1 used
download.file("https://www.irs.gov/pub/irs-utl/extrfoia-master-dt2021-07-02.zip",
              "extrfoia-master-dt2021-07-02.zip")
txt1 <- fread(cmd = "unzip -cq extrfoia-master-dt2021-07-02.zip", quote = "")

警告:这将下载一个 38 MBytes 的文件

根据unzip man page-c选项自动进行ASCII-EBCDIC转换

quote = "" 是必需的,因为在至少一种情况下,数据字段在文本中包含双引号。


我还尝试了unzip-p 选项,该选项无需 转换即可提取数据。然后,我们可以看到字符串中嵌入了\032

txt2 <- fread(cmd = "unzip -p extrfoia-master-dt2021-07-02.zip", quote = "")

txt2[47096, 1:2]
   CUST-ID                 LEGAL-NAME
1: 1253096 JOHN A. GIANNAKOP\032OULOS

\032 没有出现在转换后的版本中

txt1[47096, 1:2]
   CUST-ID             LEGAL-NAME
1: 1253096 JOHN A. GIANNAKOPOULOS

我们可以通过

在所有字符字段中搜索所有出现的\032
melt(txt2, id.vars = "CUST-ID", measure.vars = txt[, names(.SD), .SDcols = is.character])[
  value %flike% "\032"][order(`CUST-ID`)]
     CUST-ID   variable                                    value
 1:  1253096 LEGAL-NAME               JOHN A. GIANNAKOP\032OULOS
 2:  2050751   DBA-NAME         colbert ball tax tele\032hone rd
 3:  2082166 LEGAL-NAME             JUAN DE J. MORALES C\032TALA
 4:  2273606 LEGAL-NAME                   INTRINSIC DM\032  INC.
 5:  2300016 MAIL-ADDR1                            PO BOX \03209
 6:  2346154 LEGAL-NAME           JOEL I GONZ\032LEZ-APONTE  CPA
 7:  2384445 LEGAL-NAME                    NUMBERS CAF\032  PLLC
 8:  2518214 MAIL-ADDR1                      556 W 800 N N\03211
 9:  2518214 BUSN-ADDR1                      556 W 800 N N\03211
10: 13718109   DBA-NAME         World Harvest Financial Grou\032
11: 13775763 LEGAL-NAME Fiscally Responsible Consulting  LLC\032
12: 13775763   DBA-NAME Fiscally Responsible Consulting  LLC\032

这可能有助于识别要手动修复的文件记录。

【讨论】:

  • 解压参数“-c”是灵丹妙药。如果我们使用它来解压缩文件,那么 R 的内置 read.csv 可以正常工作。我无法在我的工作计算机中测试datatable 工具,但我相信它也可以。我一直在测试使用 R 的内置 unzip 功能的方法,但没有看到如何将“-c”参数传递给它。
  • 看看这个。系统更新“撤消”清理。读取确实经过到结束行,但导入的内容现在再次出现错误字符。 1: 1253096 JOHN A. GIANNAKOP\032OULOS
【解决方案2】:

我今天遇到了这个问题,所以它在 R 4.0.5 中仍然存在

我使用的数据是公开的,来自美国国税局。不知何故,无法识别的字符在数据库中变成了“^Z”。据我所知,当人们输入接收的原始程序无法识别的字符时,会无意中创建“^Z”。 IRS 从数据库中分发一个 CSV 文件。

在我正在处理的示例文件中,有 13 行(共 360,000 行)在各个位置都有 ^Z。一次一个地手动删除它们可以让 R read.table 更进一步。我发现 R 中没有任何编码设置可以解决这个问题。

我找到了 2 个解决方案。

  1. 在使用 read.csv 之前,用文本工具去掉“^Z”符号。

  2. 切换到 Python。 pandas 包函数read_csv,编码为“utf-8”正确获取所有行。但是,在产生的pandas.DataFrame 中,无法识别的字符在数据中,它看起来像一个空方块。

如果您想通过示例进行探索,请访问以下地址:https://www.irs.gov/pub/irs-utl/extrfoia-master-dt2021-07-02.zip。您找到的第一个“^Z”是第 47096 行。

【讨论】:

  • 拜托,你能检查一下my solution 使用fread() 是否适合你吗?
  • 我确认@uwe 的建议,即使用“-c”参数解压缩可以解决问题,它消除了意外字符,并且我们尝试的任何基于文本的导入器似乎都运行良好。
猜你喜欢
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 2011-08-30
相关资源
最近更新 更多