我在新版data.table
中遇到了可能的错误。我有一个带有c的2GB .csv文件。 300万行和67列。我可以使用fread()
从data.table v.1.10.4-3中读取它,但v.1.11.0 +在中间某处终止。基础read.csv()
也会遇到同样的问题。我真的很喜欢data.table
并希望在Github上创建一个错误报告,但显然我无法在任何地方上传2GB数据文件。
为了创建一个可移植的可重复示例,我需要在问题点(行号已知)周围拼接~10行的方法。如果不在.csv文件中阅读我怎么能这样做?
此外,是否有一个程序可用于打开原始文件以查看有问题的点并查看导致问题的原因?记事本/ Excel不会打开这么大的文件。
EDIT2:this是有问题的一行。它表明,应该是一行的是以某种方式分成3行。我只能假设这是由于用于创建CSV的古老软件(SAP Business Objects)中的导出错误。它引起一个问题并不令人惊讶。然而,令人惊讶的是data.table
v.1.10.4-3能够以智能方式处理它并正确读取它,而v.1.11.0 +则不能。它可以用编码或技术隐藏字符做点什么吗?
EDIT3:proof这才是真正发生的事情。
答案 0 :(得分:5)
感谢您提供输出。它显示<div class="parralax" style="height: 500px; color: red;">
</div>
<div class="home-parralax-sub-section" style="height: 1000px;">
<img src="~/images/Resources/MainImage.jpg" />
</div>
正在发出警告。你以前错过了这个警告吗?
fread
这肯定非常有用。它告诉你行号:138986。它说这行是22个字段,但它预计67个。警告可以更好地说明为什么它在那个点期待67个字段(例如,说有67个列名称,它有到目前为止看到了67列?)它给出了一些尝试(
Warning message:
In fread("Data/FP17s with TCD in March 2018.csv", na.strings = c("#EMPTY", :
Stopped early on line 138986. Expected 67 fields but found 22. Consider fill=TRUE and comment.char=. First discarded non-empty line: <<916439/0001,Q69,GDS Contract,MR A SYED,916439,Mr,SYED A Mr,A,SYED,58955,3718.00,Nine Mile Ride Dental Practice,Dental Surgery,193 Nine Mile Ride,Finchampstead,WOKINGHAM,RG40 4JD,2181233168.00,TORIN,FASTNEDGE,1 ANCHORITE CLOSE,>>
)的提示,它将在23:67列中用NA填充这条太短的行。然后它也包括该行的数据。
它是否适用于fill=TRUE
,如警告信息所示?
你说它在1.10.4-3中有效,但我怀疑它更有可能在那里提前停止,但没有警告。如果是这样,这是一个不警告的错误,现在已经修好了。
答案 1 :(得分:1)
在Windows上使用Powershell:
Get-Content YourFile.csv | Select -Index (0,19,20,21,22) > OutputFileName.csv
会将标题和行20-23转储到新文件中。
答案 2 :(得分:0)
使用skip
和nrow
的组合:
您提到使用v.1.10.4-3读取文件没有问题,对吧?因此,请将skip
用于大多数.csv
,并将nrow
设置为您想要的行数。一旦你有了data.table,就可以编写文件的那一部分,并且你有一个可移植的可重复的例子。
例如:
DT <- fread(my_file.csv, skip=138981, nrow=10)