我是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列,并且无法手动输入每个数据点。
有人可以提出另一种有效的方法吗?
答案 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
包含列df
,mark
和roll
,与列相对应。然后你可以运行:
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)