[英]How to escape comma and double quote at same time for CSV file?
我正在編寫一個 Java 應用程序以將數據從 Oracle 導出到 csv 文件
不幸的是,數據的內容可能相當棘手。 逗號仍然是分隔符,但是一行中的一些數據可能是這樣的:
| ID | FN | LN | AGE | COMMENT |
|----------------------------------------------------------------|
| 123 | John | Smith | 39 | I said "Hey, I am 5'10"." |
|----------------------------------------------------------------|
所以這是comment
欄中的字符串之一:
我說“嘿,我是 5 英尺 10 英寸”。
不開玩笑,我需要在 excel 中毫不妥協地顯示上述評論,或者從 Java 生成的 CSV 文件打開辦公室,當然不能搞亂其他常規 escaping 情況(即常規雙引號和元組中的常規逗號)。 我知道正則表達式很強大,但我們如何在如此復雜的情況下實現目標呢?
有幾個圖書館。 這里有兩個例子:
Apache Commons Lang包含一個特殊的類來轉義或取消轉義字符串(CSV、EcmaScript、HTML、Java、Json、XML): org.apache.commons.lang3.StringEscapeUtils
。
轉義為 CSV
String escaped = StringEscapeUtils .escapeCsv("I said \\"Hey, I am 5'10\\".\\""); // I said "Hey, I am 5'10"." System.out.println(escaped); // "I said ""Hey, I am 5'10""."""
從CSV UNESCAPE
String unescaped = StringEscapeUtils .unescapeCsv("\\"I said \\"\\"Hey, I am 5'10\\"\\".\\"\\"\\""); // "I said ""Hey, I am 5'10"".""" System.out.println(unescaped); // I said "Hey, I am 5'10"."
*你可以從這里下載。
如果您使用OpenCSV ,則無需擔心轉義或轉義,只需寫入或讀取內容。
寫入文件:
FileOutputStream fos = new FileOutputStream("awesomefile.csv"); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); CSVWriter writer = new CSVWriter(osw); ... String[] row = { "123", "John", "Smith", "39", "I said \\"Hey, I am 5'10\\".\\"" }; writer.writeNext(row); ... writer.close(); osw.close(); os.close();
讀取文件:
FileInputStream fis = new FileInputStream("awesomefile.csv"); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); CSVReader reader = new CSVReader(isr); for (String[] row; (row = reader.readNext()) != null;) { System.out.println(Arrays.toString(row)); } reader.close(); isr.close(); fis.close();
*你可以從這里下載。
Excel 必須能夠處理完全相同的情況。
將這些東西放入 Excel,將它們另存為 CSV,然后使用文本編輯器檢查該文件。 然后你就會知道 Excel 應用於這些情況的規則。
使 Java 產生相同的輸出。
順便說一下,Excel 使用的格式已發布...
****編輯 1:**** 以下是 Excel 的作用
****編輯 2:**** 請注意,如果您使用 " 作為附件,php 的fputcsv
與 excel 完全相同。
rdeslonde@mydomain.com
Richard
"This is what I think"
變成這樣:
Email,Fname,Quoted
rdeslonde@mydomain.com,Richard,"""This is what I think"""
感謝 Tony 和 Paul 的快速反饋,非常有幫助。 我實際上通過 POJO 找到了解決方案。 這里是:
if (cell_value.indexOf("\"") != -1 || cell_value.indexOf(",") != -1) {
cell_value = cell_value.replaceAll("\"", "\"\"");
row.append("\"");
row.append(cell_value);
row.append("\"");
} else {
row.append(cell_value);
}
總之,如果有像串內逗號或雙引號中側的小區,則第一逃脫雙引號(特殊字符"\\""
通過添加額外的雙引號(像) "\\"\\""
),然后把整個事情變成雙引號(如"\\""+theWholeThing+"\\""
)
您還可以查看Python如何編寫與 Excel 兼容的csv
文件。
我相信 Excel 的默認設置是將文字引號字符加倍 - 也就是說,文字引號"
寫為""
。
如果您使用的是 CSVWriter。 檢查您是否沒有該選項
.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
當我刪除它時,逗號按預期顯示,而不是將其視為新列
"cell one","cell "" two","cell "" ,three"
將此保存到csv文件並查看結果,因此使用雙引號進行轉義
重要的提示
"cell one","cell "" two", "cell "" ,three"
會給你一個不同的結果,因為逗號后面有一個空格,這將被視為“
在 openCSV 中,使用以下方法創建 csvWriter obj,
CSVWriter csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END, CSVWriter.DEFAULT_QUOTE_CHARACTER);
其中, DEFAULT_QUOTE_CHARACTER
非常重要。 如果您想在 csv 文件中插入任何 ',' 或 '"',它將完美運行。
String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";
這將保留 CSV 文件中的逗號
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.