Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R-sqldf()返回具有零行的数据帧_R_Csv_Sqldf - Fatal编程技术网

R-sqldf()返回具有零行的数据帧

R-sqldf()返回具有零行的数据帧,r,csv,sqldf,R,Csv,Sqldf,我正在尝试使用@JD_Long描述的方法从非常大的csv文件中读取选定数据的有效方法。该方法依赖于来自同名库的sqldf()函数。我遇到的问题是,该函数返回一个空数据帧,即列数和名称正确但行数为零的数据帧 我已经截断了格式化函数,该函数用于在sqldf()将数据帧读入工作环境后处理数据帧 但是,同样,使用原始csv文件的调用返回一个空数据帧 > print(head(sum_stats_df("2000.csv"))) [1] Year Month

我正在尝试使用@JD_Long描述的方法从非常大的csv文件中读取选定数据的有效方法。该方法依赖于来自同名库的sqldf()函数。我遇到的问题是,该函数返回一个空数据帧,即列数和名称正确但行数为零的数据帧

我已经截断了格式化函数,该函数用于在sqldf()将数据帧读入工作环境后处理数据帧

但是,同样,使用原始csv文件的调用返回一个空数据帧

> 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")