Чтение двоичных символов из файла CSV - PullRequest
0 голосов
/ 14 февраля 2012

У меня странная проблема: у меня есть файл CSV, который я правильно читаю с помощью Блокнота и MS Excel 2010.

Я попытался прочитать строки этого файла с этим кодом:

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 и ввод-вывод Java (DataInputstream и т. Д.), Но безуспешно.

Есть идеи для решения?

1 Ответ

1 голос
/ 14 февраля 2012

Вам нужно прочитать этот файл с чем-то более сложным, чем FileReader.Проверьте Как надежно угадать кодировку .Затем либо найдите что-то, что прочитает файл как закодированный, либо напишите что-нибудь, что отфильтровывает мусор.Я обнаружил, что если вы обрабатываете файл как прямой ASCII и выбрасываете все, что не является допустимым символом ASCII, он будет довольно хорошо читать прямой Unicode-файл (а также прямой ASCII-файл).Если это UTF-8 с египетскими иероглифами (и вам нужны эти иероглифы), это не очень хорошо работает.

Итак, сначала попробуйте получить «их», чтобы получить лучший файл.Если это не сработает, проведите некоторое исследование Javadoc java.io, а затем немного запрограммируйте.

...