簡體   English   中英

如何同時轉義 CSV 文件的逗號和雙引號?

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

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

如果您使用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.

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