Skip to content
Advertisement

String Builder to CSV, how to add semicolos in right place?

I downloaded the data and read by StringBuilder and achieved this result (The content of my StringBuilder)

User Manager_ID Date Humidity Temperature Pressure Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8
dt-001 N5_220 09/19/2021 20.0 20.0 1000.0 1 2 3 4 5 1 2 3
dt-002 N5_220 09/25/2021 80.0 30.0 1200.0 4 5 1 2 3 4 5 1

Is there any method, library, or someone else has a solution for specifying semicolons between data? Of course, except at the end of the line. I will be grateful for your help 🙂 What I’d like to achieve:

User; Manager_ID; Date; Humidity; Temperature; Pressure; Q1; Q2; Q3; Q4; Q5; Q6; Q7; Q8
dt-001; N5_220; 09/19/2021; 20.0; 20.0; 1000.0; 1; 2; 3; 4; 5; 1; 2; 3
dt-002; N5_220; 09/25/2021; 80.0; 30.0; 1200.0; 4; 5; 1; 2; 3; 4; 5; 1

Code:

public void download() throws IOException {
        List<FileDTO> tests = testService.getTestFileDtoList(); // from repo
        XSLXManagerTestExporter excelExporter = new XSLXManagerTestExporter(tests );
        XSSFWorkbook workBook = excelExporter.export(); // get XSSFWorkbook
        XSSFSheet selSheet = workBook.getSheet("sheet");
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i <= selSheet.getLastRowNum(); i++) {
            Iterator<Cell> cellIterator = selSheet.getRow(i).cellIterator();
            while (cellIterator.hasNext()) {
                Cell cell = cellIterator.next();
                if (sb.length() != 0)
                    sb.append(" ");
                sb.append(cell.getStringCellValue());
            }
        }
        workBook.close();
        writeBytesToFileApache(sb.toString().getBytes());
    }


 private static void writeBytesToFileApache(byte[] bytes)
            throws IOException {
        FileUtils.writeByteArrayToFile(new File(".....\file.csv"), bytes);

    }

This is my XLSX converter to StringBuilder. I’d like to heve this as .CSV

Advertisement

Answer

Have you considered using a StringJoiner?

public void download() throws IOException {
        List<FileDTO> tests = testService.getTestFileDtoList(); // from repo
        XSLXManagerTestExporter excelExporter = new XSLXManagerTestExporter(tests );
        XSSFWorkbook workBook = excelExporter.export(); // get XSSFWorkbook
        XSSFSheet selSheet = workBook.getSheet("sheet");

        List<String> csvLines = new ArrayList<>();
        for (Row row : selSheet) {
            StringJoiner sj = new StringJoiner(";");
            for (Cell cell : row) {
                sj.add(cell.getStringCellValue());
            }
            csvLines.add(sj.toString());
        }
        workBook.close();
        writeBytesToFileApache(csvLines().stream().collect(Collectors.joining("n")).getBytes());
    }

You may also want to consider a FileOutputStream instead of a List (or String Joiner or any other solution which essentially builds the entire CSV in memory and flushes it in a single go). It should be much more memory efficient, allowing you to deal with (potentially very) large excel files.

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement