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

San*_*nju 5 r rsqlite

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

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

dbSendQuery(conn=db,
"CREATE TABLE TABLE1(
MARKS INTEGER,
ROLLNUM INTEGER
NAME CHAR(25)
DATED DATE)"
)
Run Code Online (Sandbox Code Playgroud)

然而,我对如何将值导入到创建的表中感到震惊。我无法使用 INSERT INTO Values 命令,因为原始数据文件中有数千行和 20 多列,并且不可能手动输入每个数据点。

有人可以建议一种替代的有效方法吗?

MrG*_*ble 5

您正在使用脚本语言。这样做的目的实际上是为了避免手动输入每个数据点。对不起。

你有两条路:

1:您已更正加载数据库连接并在 SQLite 数据库中创建空表。好的!

要将数据加载到表中,请使用例如将文本文件加载到 R 中df <- read.table('textfile.txt', sep='|')(修改参数以适合您的文本文件)。

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

dbSendQuery(db, 'INSERT INTO table1 (MARKS, ROLLNUM, NAME) VALUES (?, ?, ?);', list(1, 16, 'Big fellow'))
Run Code Online (Sandbox Code Playgroud)

你看?第一个?得到值1,第二个?得到值16,最后一个?得到字符串Big fellow。另请注意,不要将文本占位符括在引号('")中!

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

我假设您的数据框df包含与列相对应的列markroll、 和。name然后你可以运行:

dbSendQuery(db, 'INSERT INTO table1 (MARKS, ROLLNUM, NAME) VALUES (:mark, :roll, :name);', df)
Run Code Online (Sandbox Code Playgroud)

df这将为!中的每一行执行一条 INSERT 语句。

提示!由于对每一行执行 INSERT 语句,插入数千行可能需要很长时间,因为每次插入后,数据都会写入文件并更新索引。插入,将其包含在事务中:

dbBegin(db)
res <- dbSendQuery(db, 'INSERT ...;', df)
dbClearResult(res)
dbCommit(db)
Run Code Online (Sandbox Code Playgroud)

SQLite 会将数据保存到日志文件中,并且在执行dbCommit(db). 尝试两种方法并比较速度!


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


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


Tim*_*sen 0

我不认为有一个好的方法可以直接从 R 进行大量插入。SQLite 确实有批量插入功能,但该RSQLite包似乎没有公开它。

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

.separator |
.import your_file.csv your_table
Run Code Online (Sandbox Code Playgroud)

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

有关详细信息,请参阅CSV 导入下的文档。