Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决
2016-11-21 15:01
1081 查看
转自:http://blog.csdn.net/wangjinhua520/article/details/6216693
最近要做一个程序,数据源是DBF的文件,我用Java解析它,首先需要下载个Java专用jar包javadbf-0.4.0.jar,这个是最新版的。解析代码如下:
发现错误一:
while((obj=df.nextRecord())!=null){ //解析有些DBF文件时在这句会报错,也就是读取数据转成Object数组时出错 。
错误:Failed to parse Number: For input string: “-.—” ,经过我仔细查找和查看DBF源文件,发现是因为DBF文件里有特殊字符无法解析造成的。不得与情况下,找到了javadbf-0.4.0.jar 源码。经过调试把里面DBFReader类里面的:
错误二:
就是DBF文件里规范,0x20的标记表示不删除的,0x2A的标记表示删除的。但是里面的数据还是正常,并且有更新会更新的,只是我们在读取的时候有0x2A标记的我们是读取不出来的。所有在这里又要处理了,经过调试源码,修改一个地方就可以。
目前就发现这两种情况的错误,有时候这两个错误会在同时出现,所以有时候必须这两处都要修改。
最近要做一个程序,数据源是DBF的文件,我用Java解析它,首先需要下载个Java专用jar包javadbf-0.4.0.jar,这个是最新版的。解析代码如下:
public static void main(String[] args) { try{ Object[] obj=null; //创建文件流 InputStream is=new FileInputStream("Q.DBF"); //初始化DBFReader实例 DBFReader df=new DBFReader(is); //设置编码格式,有时候解析出来的数据有乱码的,就可以加上这句 df.setCharactersetName("gb2312"); //得到文件字段数 int fileCount=df.getFieldCount(); //取出字段信息 for(int i=0;i<fileCount;i++){ DBFField field=df.getField(i); // System.out.print(field.getName()+"/t"); } System.out.println(); int i=0; while((obj=df.nextRecord())!=null){ //解析有些DBF文件时在这句会报错,也就是读取数据转成Object数组时出错 for(int j=0;j<obj.length;j++){ System.out.print(obj[j]+"/t"); // System.out.println(obj[1]); } if(i++>20)break; System.out.println(); } is.close(); }catch(Exception ex){ex.printStackTrace();} }
发现错误一:
while((obj=df.nextRecord())!=null){ //解析有些DBF文件时在这句会报错,也就是读取数据转成Object数组时出错 。
错误:Failed to parse Number: For input string: “-.—” ,经过我仔细查找和查看DBF源文件,发现是因为DBF文件里有特殊字符无法解析造成的。不得与情况下,找到了javadbf-0.4.0.jar 源码。经过调试把里面DBFReader类里面的:
case 'N': try { byte t_numeric[] = new byte[ this.header.fieldArray[i].getFieldLength()]; dataInputStream.read( t_numeric); t_numeric = Utils.trimLeftSpaces( t_numeric); /*============== 自己加的代码 below ==================*/ String strtemp = new String( t_numeric); if(strtemp.equals("-.---") || strtemp.equals("-")){ recordObjects[i]=0.0;//这行代码,在你只需要输出里面的数据时,可以不用加,不会出错。当你要读用这里面的数据时就必须加。 continue; } //这里是我自己加上的代码,就是屏蔽这个错误的。 /*============== 自己加的代码 up ==================*/ if( t_numeric.length > 0 && !Utils.contains( t_numeric, (byte)'?')) { recordObjects[i] = new Double( new String( t_numeric)); }else { recordObjects[i] = null; } }
错误二:
就是DBF文件里规范,0x20的标记表示不删除的,0x2A的标记表示删除的。但是里面的数据还是正常,并且有更新会更新的,只是我们在读取的时候有0x2A标记的我们是读取不出来的。所有在这里又要处理了,经过调试源码,修改一个地方就可以。
boolean isDeleted = false; do { if( isDeleted) { dataInputStream.skip( this.header.recordLength-1); } int t_byte = dataInputStream.readByte(); if( t_byte == END_OF_DATA) { return null; } /*====== 自己修改的地方 below ======*/ //isDeleted = ( t_byte == '*'); //这句是原始的 // isDeleted=false;//这是修改后的,这样修改后,不论是什么标记就都可以正常读取了。 /*========= 自己修改的地方 up =====*/ } while( isDeleted);
目前就发现这两种情况的错误,有时候这两个错误会在同时出现,所以有时候必须这两处都要修改。
相关文章推荐
- Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决
- 执行Hive时出现org.apache.hadoop.util.RunJar.main(RunJar.java:136) Caused by: java.lang.NumberFormatException: For input string: "1s"错误的解决办法(图文详解)
- java.lang.NumberFormatException: For input string: "9004@19004" 的解决办法
- 已解决java.lang.NumberFormatException: For input string: "7006@17006"
- IntelliJ maven项目pom文件错误failed to read artifact descriptor for xx.jar问题解决办法
- 已解决java.lang.NumberFormatException: For input string: "7006@17006"
- NumberFormatException: For input string: "undefined"问题解决记录
- java.lang.NumberFormatException: For input string: "00:06:39" 问题记录
- mybatis中SQL语句单双引号的问题java.lang.NumberFormatException: For input string: "Y"
- Struts2访问验证码异常解决OgnlValueStack:64 - ..java.lang.NumberFormatException: For input string: "1494056190
- 如何解决异常:java.lang.NumberFormatException: For input string: "null"
- 解决:java.lang.NumberFormatException: For input string: "id"
- Java 简单解决springmvc获取properties文件里面中文内容出现论码问题(我遇到的问题是数据提交检验时返回的错误提示出现乱码)
- [Android] "Failed to find Java version for 'C:\Windows\system32\java.exe"问题的解决方法
- hibernate 中createSQLQuery 聚合分组 java.lang.NumberFormatException: For input string:错误的一个解决办法
- 常见错误:java.lang.NumberFormatException: For input string: "6 "
- 关于jstl EL用法的注意点(java.lang.NumberFormatException: For input string: "userName")
- Java读取properties文件中文乱码问题解决
- java.lang.NumberFormatException: For input string: "0"
- 解决ADO读取Excel,数据丢失、数据错误、数据乱码问题