生成csv檔案時的一個坑?

CSV檔案是業務的處理結果常見的持久化方式。

本文就分享將資料寫入csv檔案時的一個坑:沒有對字串中的英文逗號進行特殊處理

工具/原料

Java

IntelliJ IDEA

方法/步驟

先上個預期的結果圖:

結果檔案有三列,表頭分別為id,Name,Desc

生成csv檔案時的一個坑

再上一段生成上述csv的程式碼:

package chapter4;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

/**

* Created by MyWorld on 2016/3/23.

*/

public class CsvWriter {

public static void main(String[] args) throws IOException {

List source = getResult();

CsvWriter csvWriter = new CsvWriter();

csvWriter.write(source);

} private static List getResult() {

String title = "id,Name,Desc";

List source = new ArrayList ();

source.add(title);

source.add(String.format("1,Tom,%s", "My name is tom."));

source.add(String.format("2,Jim,%s", "My name is Jim,twenty years old"));

source.add(String.format("3,John,%s", "My name is John.Hello!"));

return source;

} public void write(List source) throws IOException {

File file = new File("result.csv");

System.out.println(file.getAbsolutePath());

FileWriter fw = new FileWriter(file);

for (String line : source) {

fw.write(String.format("%s \n", line));

}

fw.flush();

fw.close();

}

}

生成csv檔案時的一個坑

生成csv檔案時的一個坑

執行上述程式碼,

看看生成的結果檔案是什麼樣的。

咦,怎麼第三行的“twenty years old ”到第四列了

生成csv檔案時的一個坑

看看原因:

id,Name,Desc

1,Tom,My name is tom.

2,Jim,My name is Jim,twenty years old

3,John,My name is John.Hello!

生成csv檔案時的一個坑

原來,每二行記錄的第三列的字串中有英文逗號,而csv格式的檔案是使用英文逗號分隔不同欄位值的。

csv解析器在展示csv檔案的內容時,把“twenty years old”展示到第四列了

解決辦法:

給第三列字串加雙引號

更改程式碼,因為字串外面已經有雙引號了,需要將新增的雙引號進行轉義

Code:

source.add(String.format("2,Jim,\"%s\"", "My name is Jim,twenty years old"));

生成csv檔案時的一個坑

看看生成的結果與實際是否一致

是一致的!!

OK

生成csv檔案時的一個坑

生成csv檔案時的一個坑

相關問題答案