1

对于我正在为客户开发的应用程序,我有一个大型高尔夫球场 SQLite 数据库,该数据库在版本化更新中重新填充了新数据,即将新数据添加到数据库中已有的现有记录中。

这些更新的一部分是数字和文本数据的混合,这些数据会自动导出为带有逗号分隔符的 .txt 文件(但也可以导出为 .rtf,尽管我认为 .txt 会更容易使用)。此 Pastebin 链接中给出了此类输出 .txt 文件的示例。

处理读取 .txt 文件并从每一行中获取每个值的代码是

// Insert records from csv file into database
        BufferedReader reader = new BufferedReader(new InputStreamReader(in_s));
        try {
            String line;
            while ((line = reader.readLine()) != null) {
                String[] RowData = line.split(", ");
                int numEntries = RowData.length;
                if(numEntries == 5) {
                    // Course Insertion Row
                    //                      "Scenic Hills CC - WHITE", 70.0, 124, "Pensacola", "FL"
                    courseHelper.createCourse(RowData[0], Double.valueOf(RowData[1]), Integer.parseInt(RowData[2]), RowData[3], RowData[4]);
                    mCurrentLine++;
                }
                else {
                    // Hole Insertion Row
                    //                      1, 1, 4, 416
                    holeHelper.createHole(Integer.parseInt(RowData[0]), Integer.parseInt(RowData[1]), Integer.parseInt(RowData[2]), Integer.parseInt(RowData[3]));
                    mCurrentLine++;

                }                   
            }
        }

希望尝试自己处理课程数据库更新的客户不是非常精通技术,而是坚持使用他向我发送每次更新的新 .txt 文件的方法。

但是,随着我收到的一些 .txt 文件越来越大,我开始在每 100 行大约 2 行出现“java.lang.NumberFormatException:无法将'6'解析为整数”类型错误该文件的长度,除了 6 之外的不同数字,取决于 .txt 文件的哪一行导致异常。

在 Bless Hex Editor 中打开 .txt 文件,我注意到在导致 NumberFormatException 的每一行的开头,非 ascii 字符(以十六进制表示,EF BB)就在前导整数之前。显然,这个非 ASCII 字符正在使parseInt()方法崩溃。

经过漫长的解释,我有两个主要问题:

  1. 即使这些非ASCII字符的放置在整个文件中似乎是伪随机的,解决根问题的最佳方法是什么?
  2. 如果无法对#1 进行良好修复,那么在相关活动中读入 .txt 文件之前“清理”它的好方法是什么?

提供的任何帮助将不胜感激。谢谢!

4

2 回答 2

1

它可以是字节顺序标记 (http://en.wikipedia.org/wiki/Byte_order_mark)。EF BB 看起来像是 BOM 的一部分,用于在文本流的开头标识 UTF-8 编码。

我会问客户是如何生成这些文件的。如果任何进程将多个文件混合到一个更大的文件中,它可能会错误地将多个 BOM 吐出到最终流中。

如果您无法修复生成这些文件的过程,您可以围绕它编写代码。尝试捕获数字格式异常,倒回流(如果可能/必要)并测试是否是这两个字节引起的。如果是这样,丢弃这两个字节并解析下一个整数。

于 2012-10-12T02:33:07.937 回答
0

parseInt为检测 BOM ( if (str.startsWith("\uFEFF"))) 并删除它编写一个包装函数。

于 2012-10-12T06:50:42.507 回答