Bład parsowania CSV to XLSX

0

Mam problem z parsowaniem duzego pliku z CSV do XLSX. O ile nie mam problemy z plikem testowy ( który jest okrojoną wersją ) to z pełnym tak.

Line 142 => for (CSVRecord csvRecord : csvParser) in this method

public LinkedHashMap<String, LinkedHashMap<String, List<CSVRecord>>> processInputCSV(Path path) throws IOException {
        LinkedHashMap<String, LinkedHashMap<String, List<CSVRecord>>> map = new LinkedHashMap<>();
        try (
                Reader reader = Files.newBufferedReader(path);
                CSVParser csvParser = new CSVParser(reader, CSVFormat.EXCEL)
        ) {
            logger.info("Preparation of a file whitout data aggregation");
            for (CSVRecord csvRecord : csvParser) {
                String resource = csvRecord.get(0);
                String order = csvRecord.get(10);
                LinkedHashMap<String, List<CSVRecord>> inner = map.getOrDefault(resource, new LinkedHashMap<>());
                List<CSVRecord> entries = inner.getOrDefault(order, new ArrayList<>());
                entries.add(csvRecord);
                inner.put(order, entries);
                map.put(resource, inner);
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        }
        return map;
    }

Dostaje taki błąd

Exception in thread "main" java.lang.IllegalStateException: MalformedInputException reading next record: java.nio.charset.MalformedInputException: Input length = 1
    at org.apache.commons.csv.CSVParser$CSVRecordIterator.getNextRecord(CSVParser.java:145)
    at org.apache.commons.csv.CSVParser$CSVRecordIterator.hasNext(CSVParser.java:155)
    at com.test.converter.CsvConverter.processInputCSV(CsvConverter.java:142)
    at com.test.converter.CsvConverter.main(CsvConverter.java:229)
Caused by: java.nio.charset.MalformedInputException: Input length = 1
Caused by: java.nio.charset.MalformedInputException: Input length = 1

    at java.base/java.nio.charset.CoderResult.throwException(CoderResult.java:274)
    at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339)
    at java.base/sun.nio.cs.StreamDecoder.read(StreamDecoder.java:178)
    at java.base/java.io.InputStreamReader.read(InputStreamReader.java:181)
    at java.base/java.io.BufferedReader.read1(BufferedReader.java:210)
    at java.base/java.io.BufferedReader.read(BufferedReader.java:287)
    at java.base/java.io.BufferedReader.fill(BufferedReader.java:161)
    at java.base/java.io.BufferedReader.read(BufferedReader.java:182)
    at org.apache.commons.csv.ExtendedBufferedReader.read(ExtendedBufferedReader.java:58)
    at org.apache.commons.csv.Lexer.nextToken(Lexer.java:95)
    at org.apache.commons.csv.CSVParser.nextRecord(CSVParser.java:674)
    at org.apache.commons.csv.CSVParser$CSVRecordIterator.getNextRecord(CSVParser.java:142)
    ... 3 more

0

No ale co ci mamy tu powiedzieć skoro wywala sie biblioteka na jakimś pliku? To nie błąd w kodzie który pokazałeś. Jeśli mam zgadywać to może biblioteka nie wspiera poprawnie różnych newline i np. łyka linuxowe \n ale sypnie się dla windowsowego \r\n? Zapnij debugger na at java.base/sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:339) albo na całe to przejście i zobacz czemu rzuca wyjątek.

1

Co to znaczy "do XLSX"? Jaki jest związek tego z XLSX?
Excel może zapisywać CSV na różne sposoby różniące się np. kodowaniem znaków i może z tego wynika problem.

0

Tak doszedłem do tego że problem leży po stronei kodowania. Zapisałem CSV jeszcze raz ale w kodowaniu UTF-8 i działa. Czy mogę to jakos w trakcie parsowania przerabiać tak że nawet jak dostane plik w innym kodowaniu to on sobie to przerobi w trakcie odpalenia programu ?

Ogólnei cąły program przetwarza CSV do XLSX. W tym przykładnie co wstawiłem to nie ma to związku aleogólnikowe działanie programu ma na celu włąsnie konwersje miedzy tymi dwoma formatami

2

@MySpectre: Możesz ustawić kodowanie. Tylko musisz je znać z góry.

I wyszukiwarka podaje jeszcze takie coś: https://tika.apache.org/0.8/api/org/apache/tika/parser/txt/CharsetDetector.html
Ale tego typu wynalazki nigdy nie działają w 100%.

1 użytkowników online, w tym zalogowanych: 0, gości: 1