2012-02-14 13 views
0

ファイル私は奇妙な問題を抱えている:私は、メモ帳やMSエクセルで正しく2010読むバイナリ文字は

を読んでCSVファイルを持っている私は、このコードで、このファイルの行を読んでみました:

BufferedReader source = new BufferedReader(new FileReader(fileName)); 
String currentRow = null; 
while (null != (currentRow=source.readLine())){ 
    System.outprintln(currentRow) 
}   

プログラムが実行されるとき、私はバイナリ文字を読み込み、行の長さは現実とは異なります(私は行に2000文字が必要で、55文字または1文字を見つけました)。

私はEclipseで動作します。私はテキストエディタとして、このCSVファイルを開くと、私は奇妙な文字を読んで、私はシステムエディタとして、それを開いたとき、私はMS Excelの内部で正しい値を読み取ります。

このファイルのタイプは、カンマ区切りのMicrosoft Excelのファイルです:このファイルにはバイナリ文字がいくつかありますか?

私はこのコードではApache POI(CSVでとXLSでファイルの読み込み)を使用しようとした:

public void displayFromExcel (String xlsPath){ 
    POIFSFileSystem fileSystem = null; 
    try{ 
     fileSystem = new POIFSFileSystem (new FileInputStream (xlsPath)); 
     HSSFWorkbook workBook = new HSSFWorkbook (fileSystem); 
     HSSFSheet sheet = workBook.getSheetAt (0); 
     Iterator<Row> rows = sheet.rowIterator(); 

     while (rows.hasNext()){ 
      HSSFRow row = (HSSFRow) rows.next(); 
      System.out.println ("Row No.: " + row.getRowNum()); 
      Iterator<Cell> cells = row.cellIterator(); 
      while (cells.hasNext()){ 
       HSSFCell cell = (HSSFCell) cells.next(); 

       System.out.println ("Cell No.: " + cell.getCellNum()); 

       switch (cell.getCellType()){ 
        case HSSFCell.CELL_TYPE_NUMERIC : 
         System.out.println ("Numeric value: " + cell.getNumericCellValue()); 
         break; 
        case HSSFCell.CELL_TYPE_STRING : 
         HSSFRichTextString richTextString = cell.getRichStringCellValue(); 
         System.out.println ("String value: " + richTextString.getString()); 
         break; 
        default : 
         System.out.println ("Type not supported."); 
         break; 
       } 
      } 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

私がコンソールにこのメッセージが表示された、機能していません。

java.io.IOException: Invalid header signature; read 0x003000310030FEFF, expected 0xE11AB1A1E011CFD0 
    at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:125) 
    at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:153) 
それはこの命令を実行します は

POIFSFileSystem fileSystem = new POIFSFileSystem (new FileInputStream (xlsPath)); 

私は、ライブラリを使用しようとしたdatafile d Java I/O(DataInputstreamなど)ですが、成功しません。

解決策はありますか?

+2

投稿したエラーに基づいてExcelファイルのヘッダが間違っていると思います。 – Adrian

+0

0xfffeはいくつかのテキストファイルの先頭にあるいくつかのユニコードヘッダです。 – James

答えて

1

このファイルは、FileReaderよりも複雑なもので読む必要があります。 How to reliably guess encodingをチェックしてください。次に、ファイルをエンコードされたものとして読んだり、ジャンクを除外する何かを見つけたりしてください。私はあなたがファイルをストレートASCIIとして扱い、有効なASCII文字ではないものをすべて取り除くと、まっすぐなUnicodeファイル(そしてまっすぐなASCIIファイル)を非常にうまく読み取ることが分かっています。それがエジプトの象形文字でUTF-8であるなら(そしてあなたはそれらの象形文字が欲しい)これはうまくいきません。

最初に、より良いファイルを提供するために「それら」を得ることを試みてください。それがうまくいかない場合は、java.io Javadocでいくつかの調査を行い、次にプログラミングをしてください。

関連する問題