android - 无法将明显的整数解析为整数

时间:2012-10-12 01:36:36

标签: android sqlite

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

这些更新的一部分是数字和文本数据的混合,它们自动导出为带逗号分隔符的.txt文件(但也可以导出为.rtf,但我认为.txt会更容易跟...共事)。这种输出.txt文件的示例是at this Pastebin link

处理读取.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文件的方法。< / p>

但是,由于我收到的一些.txt文件越来越大,我开始得到“java.lang.NumberFormatException:无法解析'6'作为整数” - 约2行的类型错误根据.txt文件的哪一行导致异常,文件长度为100行,不同于6的不同数字。

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

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

  1. 修复根问题的最佳方法是什么,即使这些非ascii字符的位置在整个文件中显示为伪随机?
  2. 如果无法对#1进行良好的修复,那么在相关活动中读入之前,对.txt文件进行“清理”的好方法是什么?
  3. 非常感谢提供的任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

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

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

如果无法修复生成这些文件的进程,则可以对其进行编码。尝试捕获数字格式异常,回滚流(如果可能/必要)并测试以查看是否有相同的两个字节引起它。如果是,则丢弃这两个字节并解析下一个整数。

答案 1 :(得分:0)

parseInt编写一个包装函数,用于检测BOM(if (str.startsWith("\uFEFF")))并将其删除。