一尘不染

CSV文件如何同时转义逗号和双引号?

java

我正在编写一个Java应用程序以将数据从Oracle导出到CSV文件

不幸的是,数据的内容可能非常棘手。分隔符仍然是逗号,但连续的一些数据可能是这样的:

| ID    |   FN    |   LN   |  AGE   |  COMMENT                   |
|----------------------------------------------------------------|
| 123   |  John   |  Smith |   39   | I said "Hey, I am 5'10"."  |
|----------------------------------------------------------------|

因此,这是该comment列上的字符串之一:

我说:“我是5‘10”。

别开玩笑了,我需要在Java生成的CSV文件中的excel或开放式办公室中显示上述注释,而又不能妥协,并且当然不能弄乱其他常规的转义符情况(即,常规的双引号和元组中的常规逗号)。我知道正则表达式功能强大,但是在如此复杂的情况下如何实现目标呢?


阅读 768

收藏
2020-09-08

共1个答案

一尘不染

有几个库。这是两个示例:


❐Apache Commons Lang

阿帕奇共享郎包括一类特殊的逃避或UNESCAPE字符串(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 取消转义

        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();
  • 您可以从 这里 下载
2020-09-08