簡體   English   中英

如何使用 common-csv lib 編寫 csv 文件

[英]How to write csv file using common-csv lib

我正在使用 common-csv 從請求正文中編寫 CSV 文件,並且我在同一行中使用雙引號獲取所有記錄:

Client Name,Value
"client 1,1.0","client 2,2.0","client 3,53.78","client 4,3.0","client 5555555,4.0","client 6,33.0","client 7,0.0","client 8,8.5"

我需要的是:

Client Name, Value
"client 1", 1.0
"client 2", 2.0
"client 3", 53.78 (and so on)

這是代碼(部分):

@PostMapping(value = "/v1/csv")
    public ResponseEntity<InputStreamResource> exportCSVV2(@RequestBody ClientDataObjectRequest clientDataObjectRequest){

        String[] csvHeader = {"Client Name","Value"};
        List<List<CompanyChartData>> csvBody = new ArrayList<>();
        csvBody.add(clientDataObjectRequest.getCompanyChartData());

        ByteArrayInputStream byteArrayOutputStream;

        try(
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                CSVPrinter csvPrinter = new CSVPrinter(
                        new PrintWriter(out),
                        CSVFormat.EXCEL.withHeader(csvHeader)
                );
        ) {

            for (List<CompanyChartData> record: csvBody) {
                csvPrinter.printRecord(record);

            }
            csvPrinter.flush();
            byteArrayOutputStream = new ByteArrayInputStream(out.toByteArray());
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage());
        }

        InputStreamResource fileInputStream = new InputStreamResource(byteArrayOutputStream);

        String dateFile = new SimpleDateFormat("MM-dd-yyyy").format(new java.util.Date());
        String timeFile = new SimpleDateFormat("HH-mm").format(new java.util.Date());
        String fileName = clientDataObjectRequest.getMetricName().replace(" ","_") + "_" + dateFile + "T" + timeFile;

        HttpHeaders headers = new HttpHeaders();
        headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + fileName + ".csv");
        headers.set(HttpHeaders.CONTENT_TYPE, "text/csv");

        return new ResponseEntity<>(
                fileInputStream,
                headers,
                HttpStatus.OK
        );
    }

上面的代碼正在生成我不想要的響應。 我嘗試過其他方法,例如將 CSVFormat 更改為另一個標准,也嘗試使用方法“printRecords”而不是“printRecord”。 我在文檔中做了一些研究,但我很難理解它。

查看您的代碼和來自printRecord方法的結果,我的第一個猜測是您的請求映射不正確。

根據printRecord方法的文檔,它將:

將給定值打印為分隔符分隔值的單個記錄,后跟記錄分隔符。

查看上面的代碼,它只是執行一個 for 循環,直到集合中沒有更多的值,然后才打印新行。

for (final Object value : values) {
    print(value);
}
println();

根據上面給出的 output ,這意味着您的 for 循環中的List<CompanyChartData> record是一個包含 Object 的列表,其中包含來自請求的所有值,而不是包含您的鍵值對的對象列表。

我的假設是,如果您將System.out.println語句放在 for 循環中或附加調試器,它應該只打印一次。

我發現了如何改變結果。
而不是使用這種方式:

try(
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                CSVPrinter csvPrinter = new CSVPrinter(
                        new PrintWriter(out),
                        CSVFormat.EXCEL.withHeader(csvHeader)
                );
        ) {

            for (List<CompanyChartData> record: csvBody) {
                csvPrinter.printRecord(record);

            }

我改為這種方法:

try(
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                CSVPrinter csvPrinter = new CSVPrinter(
                        new PrintWriter(out),
                        CSVFormat.DEFAULT.withHeader(csvHeader).withQuoteMode(QuoteMode.NON_NUMERIC)
                );
        ) {

            for (CompanyChartData record: csvBody) {
                csvPrinter.printRecord(record.getClientName(), record.getValue());

            }

回應是

"Client Name","Value"
"client 1",1.0
"client 2",2.0
"client 3",53.78

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM