R-sqldf()返回具有零行的数据帧
我正在尝试使用@JD_Long描述的方法从非常大的csv文件中读取选定数据的有效方法。该方法依赖于来自同名库的sqldf()函数。我遇到的问题是,该函数返回一个空数据帧,即列数和名称正确但行数为零的数据帧 我已经截断了格式化函数,该函数用于在sqldf()将数据帧读入工作环境后处理数据帧 但是,同样,使用原始csv文件的调用返回一个空数据帧R-sqldf()返回具有零行的数据帧,r,csv,sqldf,R,Csv,Sqldf,我正在尝试使用@JD_Long描述的方法从非常大的csv文件中读取选定数据的有效方法。该方法依赖于来自同名库的sqldf()函数。我遇到的问题是,该函数返回一个空数据帧,即列数和名称正确但行数为零的数据帧 我已经截断了格式化函数,该函数用于在sqldf()将数据帧读入工作环境后处理数据帧 但是,同样,使用原始csv文件的调用返回一个空数据帧 > print(head(sum_stats_df("2000.csv"))) [1] Year Month
> print(head(sum_stats_df("2000.csv")))
[1] Year Month DayofMonth DayOfWeek DepTime
[6] CRSDepTime ArrTime CRSArrTime UniqueCarrier FlightNum
[11] TailNum ActualElapsedTime CRSElapsedTime AirTime ArrDelay
[16] DepDelay Origin Dest Distance TaxiIn
[21] TaxiOut Cancelled CancellationCode Diverted CarrierDelay
[26] WeatherDelay NASDelay SecurityDelay LateAircraftDelay
<0 rows> (or 0-length row.names)
>打印(头(sum\u stats\u df(“2000.csv”))
[1] 年-月-月-月-月-月-月-月-日
[6] CRSDepTime ArrTime CRSRARRTIME UniqueCarrier FlightNum
[11] TailNum ActualElapsedTime CRSElapsedTime AirTime ARR延迟
[16] DepDelay原点Dest距离滑行
[21]滑行取消取消代码转移承运人延迟
[26]WeatherDelay NASDelay安全延迟延迟延迟延迟飞机延迟
(或长度为0的行名称)
所以我想知道我从ASA下载的csv文件与我在本地使用
write.csv()
编写的csv文件有什么不同?sqldf()
返回空数据帧但获取所有列名的其他原因可能是什么?您可以从引用的网页下载的文件是bzip压缩的。当直接使用压缩文件时,我可以重现您的问题。一种可能的解决方案是在将文件与sqldf
一起使用之前对其进行解压缩。这是不幸的,因为其他用于读取CSV文件的工具直接支持bzip压缩文件。我不知道如何直接使用sqldf()
执行此操作,但同一软件包中的read.csv.sql
支持过滤器
选项,使以下功能成为可能:
sum_stats_df <- function(f_name){
read.csv.sql(f_name, sql = "select * from file limit 6", filter = "bunzip2")
}
sum\u stats\u dfSQLite对行尾字符很挑剔,如果文件来自其他地方,这些字符可能与操作系统上的默认字符不同
在Windows和Linux Ubuntu上,假设您已经解压了它,这对我来说是有效的:
read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n")
或者在Windows上,使用原始bz2文件并假设7z可执行文件位于您的路径上,执行此变体:
read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n",
filter = "7z x -so 1987.csv.bz2 2>NUL")
在Linux上,我们可以使用bzip2:
read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n",
filter = "bzip2 -cd 1987.csv.bz2")
上的常见问题16有一个与此非常类似的示例。我看到的一个问题是,您使用的是限制
,而不使用订购依据
。这没有意义,因为您没有告诉数据库如何限制结果集。你想要哪6条记录?据我所知,我可能是错的,使用limit这种方法将类似于只获取前6行。但我已经无限尝试了,得到了相同的空数据帧。请阅读,看看你是否可以从文件中读取,因为你已经在函数中打开了它。添加了l感谢你的输入,但我在加载文件之前先解压缩了文件。不过,我想知道解压过程中是否存在一些处理或格式化问题。您在哪个操作系统上使用了哪个工具来解压文件?您当前的文件大小是多少?相比之下,2008年的数据有109 MB压缩,有658 MB没有压缩。在Excel中打开本地创建的csv文件和下载并解压缩的文件并没有发现两者之间的任何区别。但在notebook++中打开它们时,在前者的某些列中显示了一些值的引号。考虑到这一点,我尝试使用arg方法为每个列定义类。仍然不起作用。我使用了7_zip,在我的例子中解压的2008 csv文件是673MB。这很奇怪。打开文件后,是否可以将print(f)
添加到函数中,并在对其中一个文件调用函数时发布结果?
read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n")
read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n",
filter = "7z x -so 1987.csv.bz2 2>NUL")
read.csv.sql("1987.csv", "select * from file limit 3", eol = "\n",
filter = "bzip2 -cd 1987.csv.bz2")