如何使用RSqlite将CSV导入sqlite?

11

我发现在sqlite shell中可以使用.import命令,但在R环境中好像无法使用,有什么建议吗?

2个回答

22

您可以使用sqldf包中的read.csv.sql函数。只需一行代码即可完成读取。假设您想创建一个新的数据库testingdb,然后将文件读入其中,请尝试以下代码:


read.csv.sql("filename.csv", sql = paste("CREATE TABLE my_table", "SELECT * FROM file", sep = "\n"), dbname = "testingdb")
# create a test file
write.table(iris, "iris.csv", sep = ",", quote = FALSE, row.names = FALSE)

# create an empty database.
# can skip this step if database already exists.
sqldf("attach testingdb as new")
# or: cat(file = "testingdb")

# read into table called iris in the testingdb sqlite database
library(sqldf)
read.csv.sql("iris.csv", sql = "create table main.iris as select * from file", 
  dbname = "testingdb")

# look at first three lines
sqldf("select * from main.iris limit 3", dbname = "testingdb")

以上使用了 sqldf,它使用 RSQLite。你也可以直接使用 RSQLite。请参阅 RSQLite 中的 ?dbWriteTable。请注意,如果你直接使用 dbWriteTable,可能会出现行结束符问题,而 sqldf 通常会自动处理。

如果你的意图是将文件读入数据库后立即将其读入 R,并且之后不再需要数据库,则请参见:

http://code.google.com/p/sqldf/#Example_13._read.csv.sql_and_read.csv2.sql


sqldf太棒了!也可以查看这个答案https://dev59.com/UlLTa4cB1Zd3GeqPZ2P1 - Jay
但是它会在会话结束时删除文件。有没有办法保留它? - xiaodai
1
@xiaodai,上述代码中sqldf不会删除数据库或输入文件。sqldf只会删除它创建的任何数据库,但是sqldf永远不会删除输入文件和它没有创建的数据库。在这种情况下,数据库不是由sqldf本身创建的(它是通过“attach”语句由后端SQLite创建的,而不是由前端sqldf创建的),因此sqldf不会将其删除。请注意,sqldf旨在用于数据框的即席操作,但如果您处理持久性数据库,则可能需要直接使用RSQLite、RH2或其他数据库接口包。 - G. Grothendieck
这是一个很棒的回答。有一个问题。如果我想使用sqldf("attach testingdb as new"),它必须在library(sqldf)之后对吧? - user3259937
是的,library(sqldf)会加载sqldf包,使用sqldf命令需要该包。 - G. Grothendieck

2

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