对于我正在为客户开发的应用程序,我有一个大型高尔夫球场的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()
方法崩溃。
经过长时间的解释,我有两个主要问题:
非常感谢提供的任何帮助。谢谢!
答案 0 :(得分:1)
它可以是字节顺序标记(http://en.wikipedia.org/wiki/Byte_order_mark)。 EF BB看起来像BOM的一部分,用于在文本流的开头标识UTF-8编码。
我会问客户端是如何生成这些文件的。如果任何进程将多个文件混合到一个更大的文件中,则可能会错误地将多个BOM分散到最终流中。
如果无法修复生成这些文件的进程,则可以对其进行编码。尝试捕获数字格式异常,回滚流(如果可能/必要)并测试以查看是否有相同的两个字节引起它。如果是,则丢弃这两个字节并解析下一个整数。
答案 1 :(得分:0)
为parseInt
编写一个包装函数,用于检测BOM(if (str.startsWith("\uFEFF"))
)并将其删除。