将大型CSV文件导入SQLite的UNIX方法

5
我有一个5GB的csv文件(也可以作为sas数据文件,如果更容易),我需要将其放入SQL数据库中,以便在R中使用它。
变量名称都包含在第一行观察值中,并用双引号括起来。有1000多个变量,其中一些是数值型,其他是字符型(虽然有些字符变量是数字字符串,但我不太担心,我可以在R中修复它)。
我的问题是如何将csv文件导入到我的数据库中的新表中,使得操作最简便?
我发现有人说要先创建你的表(其中包括指定所有变量,我有1000+个变量),然后使用“.import file table”来导入数据。 或者,使用一些GUI导入向导,但这对我来说不是一个选项。
如果这是SQL 101,那我很抱歉,但感谢您的帮助。

1
你有多少RAM可供使用? - Matt Parker
我们刚刚转换到了一个新的研究集群,因此我需要与管理员确认具体细节,但我相信使用默认的作业提交选项,我可以获得16 GB的内存,当然如果需要的话,我可以请求更多。 - MaDMaD Mad
请确保检查将所有内容保存在内存中的选项。从程序中不时地保存工作区。16GB已经足够了。这样可以更快、更容易,而且您甚至可以向运营商请求更多的RAM(内存)。(您正在运行LINUX,对吗?) - mrsteve
我不认为我正确地理解了你的意思。 我可以将数据导入工作区,然后根据需要保存和重新加载它,但我不能在会话之间保留程序在内存中的加载状态。 我将要长时间使用这个数据集,加载工作区需要比我想花费等待工作区加载的时间更长一些。是的,我们现在正在使用红帽系统,以前是 Solaris。 - MaDMaD Mad
2个回答

9

这是我的工作流程:

library("RSQLite")
setwd("~/your/dir")
db <- dbConnect(SQLite(), dbname="your_db.sqlite") ## will make, if not present
field.types <- list(
        date="INTEGER",
        symbol="TEXT",
        permno="INTEGER",
        shrcd="INTEGER",
        prc="REAL",
        ret="REAL")
dbWriteTable(conn=db, name="your_table", value="your_file.csv", row.names=FALSE, header=TRUE, field.types=field.types)
dbGetQuery(db, "CREATE INDEX IF NOT EXISTS idx_your_table_date_sym ON crsp (date, symbol)")
dbDisconnect(db)

field.types并不是必要的。如果没有提供这个列表,RSQLite会根据头文件来猜测。索引也不是必需的,但如果您为查询正确的列建立索引,它将加快查询速度。

我在这里学习了很多关于SQLite的知识,所以如果您查看我的问题/回答,您可能会找到一些相关的内容。


+1. 注意,如果您的逗号分隔文件具有不同的扩展名(有时候...),dbWriteTable 将会失败。只需将其重命名为 .csv 即可。 - Ryogi

4
请查看sqldf包中的“read.csv.sql”函数。
该函数将csv文件转换成SQLite数据库,然后将其读入R中,您应该能够保留中间数据库以便于您的使用。

2
您可以在sqldf主页的示例13d中找到使用sqldf将csv文件读入sqlite数据库的示例:http://code.google.com/p/sqldf/#Example_13._read.csv.sql_and_read.csv2.sql - G. Grothendieck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接