我是 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 多列,并且不可能手动输入每个数据点。
有人可以建议一种替代的有效方法吗?
您正在使用脚本语言。这样做的目的实际上是为了避免手动输入每个数据点。对不起。
你有两条路:
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包含与列相对应的列mark、roll、 和。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
我不认为有一个好的方法可以直接从 R 进行大量插入。SQLite 确实有批量插入功能,但该RSQLite包似乎没有公开它。
从命令行您可以尝试以下操作:
.separator |
.import your_file.csv your_table
Run Code Online (Sandbox Code Playgroud)
其中your_file.csv是包含数据的 CSV(或管道分隔)文件,your_table是目标表。
有关详细信息,请参阅CSV 导入下的文档。