如何通过行条件将巨大的csv文件读入R?

lin*_*nus 10 r

我有一个巨大的csv文件大约1500万行,大小在3G左右.

我想把这个文件逐个读成R,每次只选择那些适合某种条件的行.

例如,其中一个列被称为产品类型,所以我只需要将一种类型的产品读入R中,然后处理它然后输出结果,之后我转移到另一种类型的产品......

到目前为止,我已经阅读了不同的方法,例如将大文件上传到数据库中,或者按colbycol逐列读取,或者通过ff读取一大块行...

任何纯R解决方案都能解决我的问题吗?

ROL*_*OLO 20

你可以使用这个RSQLite包:

library(RSQLite)
# Create/Connect to a database
con <- dbConnect("SQLite", dbname = "sample_db.sqlite")

# read csv file into sql database
# Warning: this is going to take some time and disk space, 
#   as your complete CSV file is transferred into an SQLite database.
dbWriteTable(con, name="sample_table", value="Your_Big_CSV_File.csv", 
    row.names=FALSE, header=TRUE, sep = ",")

# Query your data as you like
yourData <- dbGetQuery(con, "SELECT * FROM sample_table LIMIT 10")

dbDisconnect(con)
Run Code Online (Sandbox Code Playgroud)

下次要访问数据时,可以省略dbWriteTable,因为SQLite表存储在磁盘上.

注意:将CSV数据写入SQLite文件不会先将所有数据加载到内存中.因此,您最终将使用的内存将限制为查询返回的数据量.


Gre*_*now 5

只能使用R来执行此操作:

  1. 打开与文件的连接
  2. 如果有标题,则读入标题信息
  3. 使用read.csv指定colClasses和从文件中读取一行nrows=1
  4. 测试该行以查看它是否符合您的条件,如果是,则将其附加到不断增长的数据框中
  5. 对文件的其余部分重复步骤4.
  6. 关闭连接

虽然以上是可能的,但我不认为这是可取的.通过将数据加载到数据库中,然后从R内部查询数据库,可能更好地完成此类事情.