在RSQLite中为现有数据库表添加值

时间:2017-09-20 08:27:04

标签: r rsqlite

我是RSQLite的新手。 我有一个文本格式的输入文档,其中的值分别由' |' 我创建了一个包含所需变量的表(虚拟代码如下)

db<-dbconnect(SQLite(),dbname="test.sqlite")

dbSendQuery(conn=db,
"CREATE TABLE TABLE1(
MARKS INTEGER,
ROLLNUM INTEGER
NAME CHAR(25)
DATED DATE)"
)

但是我很惊讶如何将值导入到创建的表中。 我不能使用INSERT INTO Values命令,因为原始数据文件中有数千行和超过20列,并且无法手动输入每个数据点。

有人可以提出另一种有效的方法吗?

3 个答案:

答案 0 :(得分:1)

您使用的是脚本语言。这样做的目的是避免手动键入每个数据点。遗憾。

您有两条路线:

1:您已更正已加载数据库连接并在SQLite数据库中创建了一个空表。尼斯!

要将数据加载到表格中,请使用以下方法将文本文件加载到R中: Reading ROI file failed. invalid argument: roi=roi.txt (修改参数以适合您的文本文件)。

要拥有“动态”INSERT语句,可以使用占位符。 RSQLite允许命名或定位占位符。要插入单行,您可以执行以下操作:

df <-
 read.table('textfile.txt', sep='|')
你知道吗?第一个dbSendQuery(db, 'INSERT INTO table1 (MARKS, ROLLNUM, NAME) VALUES (?, ?, ?);', list(1, 16, 'Big fellow')) 获得值?,第二个1获得值?,最后一个16获得了字符串?。另请注意,将文本的占位符用引号括起来Big fellow')!

现在,您有数千行。或者只是一个以上。无论哪种方式,您都可以发送数据框。 "有一些要求。 1)每个向量具有相同数量的条目(在提供data.frame时不是问题)。 2)您可以提交与占位符相同数量的向量。

我认为您的数据框dbSendQuery包含列dfmarkroll,与列相对应。然后你可以运行:

name

这将为dbSendQuery(db, 'INSERT INTO table1 (MARKS, ROLLNUM, NAME) VALUES (:mark, :roll, :name);', df) 中的每一行执行INSERT语句!

提示!因为INSERT语句是每行执行 ,所以插入数千行可能需要很长时间,因为在每次插入后,数据都会写入文件和指数已更新。插入,将其封装在一个事务中:

df

并且SQLite会将数据保存到日志文件中,仅在执行dbBegin(db) res <- dbSendQuery(db, 'INSERT ...;', df) dbClearResult(res) dbCommit(db) 时保存结果。尝试两种方法并比较速度!

2:啊,是的。第二种方式。这可以在SQLite中完全完成。 使用SQLite命令实用程序(命令行中的dbCommit(db)而不是R),可以将文本文件作为表附加,只需执行sqlite3命令即可​​。或者,将INSERT INTO ... SELECT ... ;中的文本文件读入临时表并运行sqlite3

要记住的有用网站:http://www.sqlite.com/lang.html

答案 1 :(得分:0)

我认为没有一种很好的方法可以直接从R中执行大量插入操作.SQLite确实具有批量插入功能,但RSQLite包似乎没有公开它。 / p>

从命令行中,您可以尝试以下操作:

.separator |
.import your_file.csv your_table

其中your_file.csv是包含您的数据的CSV(或竖线分隔)文件,your_table是目标表。

有关详细信息,请参阅CSV导入下的documentation

答案 2 :(得分:0)

聚会有点晚,但 DBI 提供了 dbAppendTable(),它将数据帧的内容写入 SQL 表。数据框中的列名必须与数据库中的字段名匹配。对于您的示例,以下代码会将我的随机数据帧的内容插入到您新创建的表中。

library(DBI)

db<-dbConnect(RSQLite::SQLite(),dbname=":memory")

dbExecute(db,
          "CREATE TABLE TABLE1(
             MARKS INTEGER,
             ROLLNUM INTEGER,
             NAME TEXT
           )"
)

df <- data.frame(MARKS = sample(1:100, 10), 
                 ROLLNUM = sample(1:100, 10), 
                 NAME = stringi::stri_rand_strings(10, 10))

dbAppendTable(db, "TABLE1", df)