【问题标题】:Extracting data from sqlback formatted file for conversion to CSV从 sqlback 格式文件中提取数据以转换为 CSV
【发布时间】:2012-08-31 17:38:36
【问题描述】:

我有一个表示 sqlite db 文件的 sqback 文件。我想从这个 sqback 文件中提取数据,即表名和内容,并将其转换为 csv 文件格式。我想用 Java 来做这个。

** sqback 文件在处理之前已经从 android 设备上传到 pc。所以我需要一个适合服务器端的解决方案。

有人知道如何执行这样的任务吗?

【问题讨论】:

    标签: java android sqlite csv


    【解决方案1】:

    如果使用 Android,您可以利用内置的 SQLiteDatabase 和 SQLiteOpenHelper。您将找到所有您需要的信息here

    解析完所有内容后,您可以使用 File 以您想要的方式导出到 CSV。

    编辑:所以基本上你需要做的是通过读取它们来解析字节,这样就可以访问内容。在某些情况下,您甚至不需要将它们转换为字符串,因为您可能只需要字节的值。 (即:偏移量:44 长度:4 描述:模式格式编号。支持的模式格式为 1、2、3 和 4。)。 您可以随时使用任何 HEX 编辑器检查您的值是否正确,甚至使用任何类型的文本编辑器打开 sqlite 文件都会有所帮助。

    让我们从头开始。首先,读取文件。两种方法

    • 一个。读取整个文件并在
    • 之后进行解析
    • 乙。以块的形式读取和解析整个文件(推荐,特别是对于更大的文件)

    这两种方法将共享以下大部分代码:

    File file = new File("YOUR FILE ROUTE");
    int len = 1024 * 512; //512KB
    
    try {
        fis = new FileInputStream(file);
    } catch (FileNotFoundException e1) {
        fis = null;
        e1.printStackTrace();
    }
    byte[] b = new byte[len];
    int bread;
    
    try {
    
        while((bread = fis.read(b, 0, len))!=-1)
        {
            if(parseBlock(b, bread)==1)
                return;
    }
    
        fis.close();
    
    } catch (IOException e) {
        e.printStackTrace();
    }
    

    区别在于获取部分块并动态解析它们(我猜这对你有用)和获取整个内容之间的区别是:

    fis.read(b, 0, fis.available);
    

    而不是while循环。

    最终,您的方法是正确的,这就是将字节转换为字符串的方法。 (新字符串(b))。此外,第一个字符可能代表奇怪的符号,如果您查看 SQL 的文件格式,这些是用于存储一些元数据的保留字节。 使用任何文本编辑器打开 sqlite 文件并检查您在其中看到的内容是否与您的代码中的内容匹配。

    【讨论】:

    • 非常感谢何塞。我想我应该更具体一点。我刚刚更新了问题,包括 sqback 文件从 android 设备上传到 pc 的事实,因此解析需要在服务器端进行。
    • 那么你需要开始读取字节:) 以此作为参考 (sqlite.org/fileformat.html) 我建议使用 FileInputStream 来读取文件。将读取的字节块设置为 2 的幂的倍数是很有趣的(如果您的文件达到该大小,大约 1024Kb 或 512Kb 往往是最合适的选择)。如果你完全没有这方面的经验,我可以给出一些示例代码。
    • 再次感谢,何塞。我非常感谢。中午后我会读一读并尝试一下,希望一切顺利。如果我有更多问题,我会打这个线程。 '我是 SO 的新手,而且它已经变得很棒了。
    • 我很乐意为您提供一个简短的示例。现在我正在从我的文件中读取字节到一个数组中:byte [] b,并且我正在尝试以一种有意义的方式将 b 的内容写入文件。为了完成字节到有意义文本之间的转换,我正在使用:String(b) 并且无处可去。我得到了不应该的符号(它看起来像一个里面有耳朵的盒子)。我也尝试过使用“ACSII”编码,但没有运气。我确实意识到这是一个不同的问题。
    • 我还尝试了头文件第 56 字节中指定的以下 3 种编码: byte b [] = new byte[512]; FileInputStream instream = new FileInputStream(fileName); inStream.read(b); System.out.println("UTF-8" + new String(b, "UTF-8")); System.out.println("UTF-16be" + new String(b, "UTF-16be")); System.out.println("UTF-16le" + new String(b, "UTF-16le"));
    【解决方案2】:

    该网站指出要使用哪些额外的库,并提供如何与 sqlite 文件交互的示例 (http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC#Usage)

    需要注意的重要事项:

    1) 确保包括使用当前类加载器加载 sqlite-JDBC 驱动程序。这是通过

    行完成的

    2) sqlite 文件是一个数据库,即使它不在某处的服务器上。因此,您仍然必须创建与文件的连接才能与之交互。您还必须打开连接并关闭连接。 Connection connection = null; connection = DriverManager.getConnection("jdbc:sqlite:" + path); // path is a String to the sqlite file (sqlite or sqback) connection.close(); // after you are done with the file

    3) 使用sql代码查询文件可以提取信息。这将返回一个 ResultSet 类型的可处理对象,其中包含与查询有关的数据

      Statement statement = connection.createStatement();
      statement.setQueryTimeout(30);
      ResultSet rs = statement.executeQuery("SELECT * FROM " + tblName); 
    

    4) 您可以使用带有列索引或列标题键的 get 命令从 ResultsSet 中获取数据 rs.getString("qo")

    希望对遇到和我一样问题的人有所帮助

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 2020-04-07
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-04
      • 2015-10-09
      • 1970-01-01
      • 2019-05-08
      相关资源
      最近更新 更多