如何使用SQLite脚本逐行读取.txt文件?

时间:2015-09-07 14:06:59

标签: sqlite

我正在开发一个带数据库的项目。这个数据库非常简单。只有一个表有2列:id(int)和text(string)。 为了填补这个基础,我想创建一个.sql脚本文件。 (这个数据库不是在android项目中创建的,因为我想在我的android项目中插入一个已填充的数据库)

我希望我的脚本创建表,然后读取每行上带有字符串值(对于文本列)的.txt文件。 对于每一行,它应该将字符串值插入表中。

我一般不熟悉SQLite和SQL。 我已经找到了一种使用迭代器自动增加id的方法(但我还没有测试过它),但我还是找不到如何逐行读取.txt文件。

  • 所以我的问题是:是否可以在SQLite脚本中逐行读取.txt文件?

  • 如果可以,请告诉我该怎么做。

5 个答案:

答案 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. 打开文件。
  2. 逐行阅读并在数据库中插入新行。
  3. 关闭资源并提交交易。
  4. 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名称和一些说明替换为在项目中有意义的人。这只是一个想法。