如何正确地转义双引号在CSV?

我在我的CSV中有这样一行:

"Samsung U600 24"","10000003409","1","10000003427"

24旁边的引号用于表示英寸,而该引号旁边的引号则关闭字段。我正在用fgetcsv读取行,但解析器犯了一个错误,将值读取为:

Samsung U600 24",10000003409"

我试着在英寸引号前放一个反斜杠,但我只是在名称中得到了一个反斜杠:

Samsung U600 24\"

是否有一种方法可以在CSV中正确转义这个,以便值将是Samsung U600 24",或者我必须在处理器中正则表达式它?

233236 次浏览

引用两句话:

"Samsung U600 24"""

不仅是双引号,你还需要单引号(')、双引号(")、反斜杠(\)和NUL (NULL字节)。

使用fputcsv()写入,fgetcsv()读取,这将处理所有问题。

如果值包含逗号、换行符或双引号,则字符串必须用双引号括起来。例如:“换行字符在这个字段\n”。

你可以使用下面的在线工具来转义“”和,操作符。 https://www.freeformatter.com/csv-escape.html#ad-output < / p >

我知道这是一个旧的帖子,但这里是我如何解决它(连同将空值转换为空字符串)在c#中使用扩展方法。

创建一个静态类,如下所示:

    /// <summary>
/// Wraps value in quotes if necessary and converts nulls to empty string
/// </summary>
/// <param name="value"></param>
/// <returns>String ready for use in CSV output</returns>
public static string Q(this string value)
{
if (value == null)
{
return string.Empty;
}
if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
{
return "\"" + value + "\"";
}
return value;
}

然后对于你写入CSV的每个字符串,而不是:

stringBuilder.Append( WhateverVariable );

你只需要:

stringBuilder.Append( WhateverVariable.Q() );

我用Java写过。

public class CSVUtil {
public static String addQuote(
String pValue) {
if (pValue == null) {
return null;
} else {
if (pValue.contains("\"")) {
pValue = pValue.replace("\"", "\"\"");
}
if (pValue.contains(",")
|| pValue.contains("\n")
|| pValue.contains("'")
|| pValue.contains("\\")
|| pValue.contains("\"")) {
return "\"" + pValue + "\"";
}
}
return pValue;
}


public static void main(String[] args) {
System.out.println("ab\nc" + "|||" + CSVUtil.addQuote("ab\nc"));
System.out.println("a,bc" + "|||" + CSVUtil.addQuote("a,bc"));
System.out.println("a,\"bc" + "|||" + CSVUtil.addQuote("a,\"bc"));
System.out.println("a,\"\"bc" + "|||" + CSVUtil.addQuote("a,\"\"bc"));
System.out.println("\"a,\"\"bc\"" + "|||" + CSVUtil.addQuote("\"a,\"\"bc\""));
System.out.println("\"a,\"\"bc" + "|||" + CSVUtil.addQuote("\"a,\"\"bc"));
System.out.println("a,\"\"bc\"" + "|||" + CSVUtil.addQuote("a,\"\"bc\""));
}
}

因为没有人提到过我通常的做法,我就把它打下来。当有一个棘手的字符串时,我甚至懒得转义它。

我所做的只是base64_encodebase64_decode,也就是说,在写入CSV行之前将值编码为Base64,当我想读取它时,解码。

对于你的例子,假设它是PHP:

$csvLine = [base64_encode('Samsung U600 24"'),"10000003409","1","10000003427"];

当我想求值时,我做相反的事。

$value = base64_decode($csvLine[0])

我只是不想经历这种痛苦。