2012-02-14 2 views
0

У меня есть странная проблема: у меня есть файл CSV, что я правильно читать с Notepad и MS Excel 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, а затем выполните некоторые программы.

Смежные вопросы