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

f2uvfpb9  于 2022-12-01  发布在  其他
关注(0)|答案(8)|浏览(192)

我正在编写一个Java应用程序,用于将数据从Oracle导出到csv文件
不幸的是,数据的内容可能相当棘手。逗号仍然是分隔符,但行上的一些数据可能是这样的:

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

这是comment列中的一个字符串:
我说:“嘿,我身高5英尺10英寸。”
不开玩笑,我需要显示上面的注解没有妥协,在excel或开放办公室从一个CSV文件生成的Java,当然不能搞砸了其他常规转义情况(即常规双引号,和常规逗号在一个元组)。我知道正则表达式是强大的,但我们如何才能实现这样复杂的情况下的目标?

jhiyze9q

jhiyze9q1#

有几个库。下面是两个示例:

❐ 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
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,你将不需要担心转义或unescape,只用于写入或读取内容。

  • 正在写入档案:
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();
    • 您可以从 * 此处下载。
hfsqlsce

hfsqlsce2#

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"""
bq8i3lrv

bq8i3lrv3#

感谢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+"\""

bejyjqdl

bejyjqdl4#

如果您使用的是CSVWriter,请检查是否没有

.withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)

当我删除它时,逗号按预期显示,而不是将其视为新列

iyfamqjs

iyfamqjs5#

您还可以查看Python writes Excel-compatible csv files.
我相信Excel的默认设置是对文字引号字符进行加倍-也就是说,文字引号"被写为""

mqxuamgl

mqxuamgl6#

"cell one","cell "" two","cell "" ,three"

将其保存为csv文件并查看结果,因此使用双引号进行转义

重要说明

"cell one","cell "" two", "cell "" ,three"

会得到不同的结果,因为逗号后面有一个空格,而这个空格会被视为“

smdnsysy

smdnsysy7#

String stringWithQuates = "\""+ "your,comma,separated,string" + "\"";

这将在CSV文件中保留逗号

bqf10yzr

bqf10yzr8#

在openCSV中,使用以下方法创建csvWriter对象:

CSVWriter csvWriter = new CSVWriter(writer, CSVWriter.DEFAULT_SEPARATOR, CSVWriter.DEFAULT_ESCAPE_CHARACTER, CSVWriter.DEFAULT_LINE_END, CSVWriter.DEFAULT_QUOTE_CHARACTER);

在这方面,DEFAULT_QUOTE_CHARACTER是非常重要的。它将完美地工作,如果你想插入任何','或'"'在csv文件。

相关问题