240

我的 CSV 中有这样一行:

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

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

Samsung U600 24",10000003409"

我尝试在英寸引号之前加上一个反斜杠,但后来我在名称中得到一个反斜杠:

Samsung U600 24\"

有没有办法在 CSV 中正确地转义它,以便值是Samsung U600 24",还是我必须在处理器中对其进行正则表达式?

4

5 回答 5

403

使用 2 个引号:

"Samsung U600 24"""
于 2013-07-23T11:19:32.167 回答
13

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

用于fputcsv()写作和fgetcsv()阅读,这将照顾所有。

于 2014-02-05T11:37:22.983 回答
2

我用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\""));
    }
}
于 2021-10-12T05:32:36.233 回答
-1

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

您可以使用下面的在线工具来转义 "" 和 , 运算符。 https://www.freeformatter.com/csv-escape.html#ad-output

于 2018-12-13T12:13:19.187 回答
-1

我知道这是一篇旧文章,但这是我使用扩展方法在 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() );
于 2020-04-27T19:33:58.213 回答