2

我是 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 多列,并且无法手动输入每个数据点。

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

4

3 回答 3

3

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

你有两条路线:

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

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

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

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

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

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

我假设您的数据框df包含对应于列的列mark、、rollname。然后你可以运行:

dbSendQuery(db, 'INSERT INTO table1 (MARKS, ROLLNUM, NAME) VALUES (:mark, :roll, :name);', df)

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

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

dbBegin(db)
res <- dbSendQuery(db, 'INSERT ...;', df)
dbClearResult(res)
dbCommit(db)

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


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


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

于 2017-09-20T08:45:48.100 回答
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)
于 2021-06-09T00:15:50.883 回答
0

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

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

.separator |
.import your_file.csv your_table

your_file.csv包含您的数据的 CSV(或管道分隔)文件在哪里,并且是your_table目标表。

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

于 2017-09-20T08:42:22.430 回答