【问题标题】:Inconsistent results between fread() and read.table() for .tsv file in RR中.tsv文件的fread()和read.table()之间的结果不一致
【发布时间】:2015-01-13 06:46:18
【问题描述】:

我的问题是针对我在阅读包含竞选财务数据的已发布 .tsv 文件时遇到的两个问题。

首先,file 有一个空字符,它会终止输入并在使用 data.table::fread() 时抛出错误“embedded nul in string: 'NAVARRO b\0\023 POWERS”。我知道这个问题有很多潜在的解决方案,但我希望在 R 中找到一些东西。看到 read.table() 中的 skipNul 选项后,我决定试一试。

这让我想到了第二个问题:具有合理设置的 read.table() (comment.char = "", quote = "", fill = T) 不会抛出错误,但它也是 not 检测到与 data.table::fread() 识别的文件大小相同的文件大小(使用 read.table() 的 ~100k 行与使用 data.table::fread() 的 ~8M 行)。 fread() 答案似乎更正确,因为文件大小约为 1.5GB,并且 data.table::fread() 在读取导致错误所在位置的行时识别有效数据。

Here 是指向问题代码和输出的链接。

关于为什么 read.table() 返回如此不同的结果的任何想法? fread() 通过猜测输入文件的特征进行操作,但它似乎没有猜测我在 read.table() 中没有使用的任何 exotic 选项。

感谢您的帮助!

注意 除了来源及其包含的信息外,我对相关文件一无所知。顺便说一句,消息来源来自加州国务卿。无论如何,文件太大而无法在 excel 或记事本中打开,所以除了查看 R 中的几行之外,我无法直观地检查文件。

【问题讨论】:

  • 使用更好的文本编辑器查看文件。我假设你使用的是 Windows,所以我推荐 Notepad++。
  • 添加了data.table 标签。 Matt Dowle 可能正在旅行,因为他明天要在旧金山发表演讲,但也许其他一位 data.table 大师可以提供一个假设。
  • @Roland 不幸的是,Notepad++ 崩溃了。还有一个thread 是关于更好的编辑器的主题 - 看起来我可以支付其他费用。
  • @TaylorWhite,您能否发布一个压缩文件的链接?无法下载 1.5GB atm。
  • @Arun -- 一有机会我会上传一个新文件。

标签: r import data.table


【解决方案1】:

我无法找到解决问题的 R 方法,但我能够使用依赖于 pandas 的 python 脚本:

import pandas as pd
import os

os.chdir(path = "C:/Users/taylor/Dropbox/WildPolicy/Data/Campaign finance/CalAccess/DATA")
receipts_chunked = pd.read_table("RCPT_CD.TSV", sep = "\t", error_bad_lines = False, low_memory = False, chunksize = 5e5)

chunk_num = 0
for chunk in receipts_chunked:
    chunk_num = chunk_num + 1
    file_name = "receipts_chunked_" + str(chunk_num) + ".csv"
    print("Output file:", file_name)
    chunk.to_csv(file_name, sep = ",", index = False)

这条路线的问题在于,使用“error_bad_lines = False”时,问题行会被简单地跳过而不是出错。只有少数错误案例(大约 800 万行),但这显然仍然不是最理想的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多