[英]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.