Java解析DBF文件,错误Failed to parse Number: For input string: "-.---" 或读取不出数据或乱码问题都在这里解决

转自:http://blog.csdn.net/wangjinhua520/article/details/6216693

最近要做一个程序,数据源是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);

目前就发现这两种情况的错误,有时候这两个错误会在同时出现,所以有时候必须这两处都要修改。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页