Poprawa delimitera przy prasowaniu pliku

Poprawa delimitera przy prasowaniu pliku
MySpectre
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 4 lata
  • Postów:21
0

Potrzebuje szybkiej pomocy

Parsuje plik z CSV do XLSX plus na tym pliku robie jeszcze parę rzecze ale mam problem z samym zapisem ponieważ

Ponieważ są wiersze w ktorych są cydyszłowy i to powoduje mi rozjechanie się kolumn

Pierw jako separatora używałem ","

Kopiuj
private void csvToXlsx(Path csvFilePath, Path excelFilePath) throws Exception {
        logger.info("Converting CSV to XLSX" + excelFilePath);
        BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(csvFilePath.toString())));
        XSSFWorkbook myWorkBook = new XSSFWorkbook();
        FileOutputStream writer = new FileOutputStream(new File(excelFilePath.toString()));
        XSSFSheet mySheet = myWorkBook.createSheet();
        String line = "";
        int rowNo = 0;
        while ((line = reader.readLine()) != null) {
            String[] columns = line.split(",");
            XSSFRow myRow = mySheet.createRow(rowNo);
            for (int i = 0; i < columns.length; i++) {
                XSSFCell myCell = myRow.createCell(i);
                myCell.setCellValue(columns[i]);
            }
            rowNo++;
        }
        myWorkBook.write(writer);
        writer.close();
    }

Następnie chciałem to naprawiac uzywajac Apache commons csv ale tym razem dostaje w kazdym pliku po jednym wierszy. Czy ktos moze mi napisać co robie zle ?

Kopiuj
 private void csvToXlsx(Path csvFilePath, Path excelFilePath) throws Exception {
        logger.info("Converting CSV to XLSX" + excelFilePath);
        List<CSVRecord> records = collectAllEntries(csvFilePath);
        XSSFWorkbook myWorkBook = new XSSFWorkbook();
        FileOutputStream writer = new FileOutputStream(new File(excelFilePath.toString()));
        XSSFSheet mySheet = myWorkBook.createSheet();
        records.forEach(record -> {
            int rowNo = 0;
            XSSFRow myRow = mySheet.createRow(rowNo);
            for (int i = 0; i < record.size(); i++) {
                XSSFCell myCell = myRow.createCell(i);
                myCell.setCellValue(record.get(i));
            }
            rowNo++;
        });
        myWorkBook.write(writer);
        writer.close();
    }
Shalom
I czym się ten wątek różni od Bład parsowania CSV to XLSX ? o_O
MySpectre
Tam zamknąłem temat. Po drugie tam dotyczyło kodowania tu jest juz inna bajka. Problem z separatorem ktory został poprawiony ale został błąd jeszcz samego wyswietlania się bo nadpisują mi się wiersze
lambdadziara
  • Rejestracja:ponad 6 lat
  • Ostatnio:dzień
  • Postów:442
0

co to jest za metoda collectAllEntries?

PanamaJoe
  • Rejestracja:ponad 4 lata
  • Ostatnio:około 3 lata
  • Postów:310
1
MySpectre napisał(a):

Następnie chciałem to naprawiac uzywajac Apache commons csv ale tym razem dostaje w kazdym pliku po jednym wierszy. Czy ktos moze mi napisać co robie zle ?

Kopiuj
 private void csvToXlsx(Path csvFilePath, Path excelFilePath) throws Exception {
        logger.info("Converting CSV to XLSX" + excelFilePath);
        List<CSVRecord> records = collectAllEntries(csvFilePath);
        XSSFWorkbook myWorkBook = new XSSFWorkbook();
        FileOutputStream writer = new FileOutputStream(new File(excelFilePath.toString()));
        XSSFSheet mySheet = myWorkBook.createSheet();
        records.forEach(record -> {
            int rowNo = 0;
            XSSFRow myRow = mySheet.createRow(rowNo);
            for (int i = 0; i < record.size(); i++) {
                XSSFCell myCell = myRow.createCell(i);
                myCell.setCellValue(record.get(i));
            }
            rowNo++;
        });
        myWorkBook.write(writer);
        writer.close();
    }

Wiersze Ci się nie nadpisują, tylko dla każdego rekordu z csv'ki (wiersza?) zapisujesz kolejne komórki w 0-wym wierszu Twojego arkusza:

Kopiuj
int rowNo = 0;
XSSFRow myRow = mySheet.createRow(rowNo);

Widzisz to? Jeśli nie to wróć do tego tematu: https://www.geeksforgeeks.org/variable-scope-in-java/


A poza tym sądzę, że bootcampy należy zniszczyć.
S9
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 2 lata
  • Lokalizacja:Warszawa
  • Postów:1092
2

@MySpectre:
Pomijając kwestie to co @PanamaJoe napisał to powinieneś nauczyć się korzystać z try-with-resources i java.nio.Files
Takie coś wygląda lepiej:

Kopiuj
 private static List<Row> getCsvRow(Path csvPath) {
    try(Stream<String> lines = Files.lines(csvPath)) {
      return lines
          .skip(1) //nagłówek CSV
          .map(str -> str.split(","))
          .map(Converter::mapCvsRow)
          .collect(Collectors.toUnmodifiableList());
    } catch (Exception e) {
      return Collections.emptyList();
    }
  }

Kopiuj
 try(var outputStream = Files.newOutputStream(excelPath)) {
      workbook.write(outputStream);
    } catch (Exception e) {
      e.printStackTrace(); //powinno być log.error, ale to tylko demonstracja
    }

edytowany 1x, ostatnio: scibi_92
MySpectre
Pewnie że korzystam z try-with-resources, nawet w tej klasie mam użyte 3x

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.