我正在开发一个带数据库的项目。这个数据库非常简单。只有一个表有2列:id(int)和text(string)。 为了填补这个基础,我想创建一个.sql脚本文件。 (这个数据库不是在android项目中创建的,因为我想在我的android项目中插入一个已填充的数据库)
我希望我的脚本创建表,然后读取每行上带有字符串值(对于文本列)的.txt文件。 对于每一行,它应该将字符串值插入表中。
我一般不熟悉SQLite和SQL。 我已经找到了一种使用迭代器自动增加id的方法(但我还没有测试过它),但我还是找不到如何逐行读取.txt文件。
所以我的问题是:是否可以在SQLite脚本中逐行读取.txt文件?
如果可以,请告诉我该怎么做。
答案 0 :(得分:2)
SQLite是一个嵌入式数据库;它旨在与一些“真正的”编程语言一起使用。 没有用于访问和解析文本文件的函数。
您必须以您喜欢的任何语言编写自己的脚本,或使用现有的工具
如果文本文件中存在保证不会出现的字符,则可以使用sqlite3
命令行shell和临时的单列表进行导入:
CREATE TEMP TABLE i(txt);
.separator ~
.import MyFile.txt i
INSERT INTO TheRealTable(text) SELECT txt FROM i; -- assumes id is autoincrementing
DROP TABLE i;
答案 1 :(得分:0)
您可以使用BufferedReader
。代码看起来像:
InputStream in = context.getResources().openRawResource( R.raw.your_txt_file );
BufferedReader reader = new BufferedReader( new InputStreamReader( in ) );
String line = null;
while( null != ( line = reader.readLine() ) ){
doStuffWithLine( line );
}
reader.close();
答案 2 :(得分:0)
我认为最简单的方法是在txt文件上将其转换为csv文件。然后,您可以直接在Sqlite3中或通过编程语言将其导入。
sqlite> .mode csv table_name
sqlite> .import file_name.csv table_name
答案 3 :(得分:0)
这是纯sqlite的解决方案
CREATE TEMP TABLE input (value STRING);
INSERT INTO input VALUES (TRIM(readfile('input.txt'), char(10)));
CREATE TABLE lines (s STRING);
WITH RECURSIVE
nn (s, rest)
AS (
SELECT
(SELECT SUBSTR(input.value, 0, INSTR(input.value, char(10))) FROM input),
(SELECT SUBSTR(input.value, INSTR(input.value, char(10)) + 1) FROM input)
UNION ALL
SELECT
CASE INSTR(nn.rest, char(10))
WHEN 0 THEN nn.rest
ELSE SUBSTR(nn.rest, 0, INSTR(nn.rest, char(10)))
END,
CASE INSTR(nn.rest, char(10))
WHEN 0 THEN ''
ELSE SUBSTR(nn.rest, INSTR(nn.rest, char(10)) + 1)
END
FROM nn
WHERE LENGTH(nn.rest) > 0
)
INSERT INTO lines (s)
SELECT nn.s FROM nn;
DROP TABLE input;
这里有一些细微之处:
sqlite
没有\n
转义,因此您必须使用char(10)
\r\n
换行符(尽管您可以将某些+ 1
调整为+ 2
,将char(10)
调整为char(13) || char(10)
请注意,我正在使用这种方法来解决代码的出现-https://github.com/anthonywritescode/aoc2020
答案 4 :(得分:-2)
所以我的问题是:是否可以在SQLite脚本中逐行读取.txt文件?
是强>
如果是的话,请你告诉我该怎么做。
我们去了:
伪码算法:
1)打开文件
InputStream instream = new FileInputStream("myfilename.txt");
InputStreamReader inputreader = new InputStreamReader(instream);
BufferedReader buffreader = new BufferedReader(inputreader);
2)逐行阅读并在数据库中插入新行
List<String> nameList = new ArrayList<>();
String line;
do {
line = buffreader.readLine();
if (line != null){
nameList.add(line);
}
} while (line != null);
现在您应该在数据库中插入所有名称:
storeNamesInDB(nameList);
其中
private void storeNamesInDB(nameList){
String sql = "INSERT INTO table (col1) VALUES (?)";
db.beginTransaction();
SQLiteStatement stmt = db.compileStatement(sql);
for (int i = 0; i < nameList.size(); i++) {
stmt.bindString(1, values.get(i));
stmt.execute();
stmt.clearBindings();
}
db.setTransactionSuccessful();
db.endTransaction();
}
3)关闭资源
别忘了关闭资源:
instream.close();
inputreader.close();
<强>声明!强> 您不应该复制并粘贴此代码。将每个var名称和一些说明替换为在项目中有意义的人。这只是一个想法。