将棘手的字符串转换为CSV格式

zam*_*6ak 33 c# csv flat-file

我必须从webservice输出创建一个CSV文件,CSV文件使用带逗号分隔符的带引号的字符串.我不能改变格式 ......

所以,如果我有一个string它变成了"string"......如果该值已经引用,则它们将替换为双引号.例如,str"ing变成"str""ing"......

但是,最近由于以下原因导致导入失败

  • 原始输入字符串是: "","word1,word2,..."
  • 每个单引号都被double替换为: """",""word1,word2,...""
  • 然后在写入CVS文件之前加上前缀并加上引号: """"",""word1,word2,..."""

如您所见,最终结果如下:

""""",""word1,word2,..."""
Run Code Online (Sandbox Code Playgroud)

这打破了我的导入(将其视为另一个字段)...我认为问题是","在原始输入字符串中出现的问题.

这种情况是否有CVS转义序列?

更新

上述中断的原因是由于BCP映射文件(BCP实用程序用于将CSV文件加载到SQL db中),其中终结符定义为",".因此,它没有看到1个字段,而是看到2 ...但我无法更改映射文件...

Ed *_*tes 89

我使用这段代码,它始终有效:

/// <summary>
/// Turn a string into a CSV cell output
/// </summary>
/// <param name="str">String to output</param>
/// <returns>The CSV cell formatted string</returns>
public static string StringToCSVCell(string str)
{
    bool mustQuote = (str.Contains(",") || str.Contains("\"") || str.Contains("\r") || str.Contains("\n"));
    if (mustQuote)
    {
        StringBuilder sb = new StringBuilder();
        sb.Append("\"");
        foreach (char nextChar in str)
        {
            sb.Append(nextChar);
            if (nextChar == '"')
                sb.Append("\"");
        }
        sb.Append("\"");
        return sb.ToString();
    }

    return str;
}
Run Code Online (Sandbox Code Playgroud)

  • @kavun是的,这是显而易见的,而且是有目的的.在多次调用的函数中,空检查通常是不合适的.如果您采用此代码,那么您如何处理不良数据取决于您. (3认同)

Len*_*nin 8

根据Ed Bayiates的回答:

/// <summary>
/// Turn a string into a CSV cell output
/// </summary>
/// <param name="value">String to output</param>
/// <returns>The CSV cell formatted string</returns>
private string ConvertToCsvCell(string value)
{
    var mustQuote = value.Any(x => x == ',' || x == '\"' || x == '\r' || x == '\n');

    if (!mustQuote)
    {
        return value;
    }

    value = value.Replace("\"", "\"\"");

    return string.Format("\"{0}\"", value);
}
Run Code Online (Sandbox Code Playgroud)

  • 但计算量大得多,贵得多!Ed的代码使用StringBuilder是有充分理由的.对于大型CSV文件,性能会下降几个数量级!容易是相对的.如果您喜欢花费数小时追踪代码中的性能瓶颈,请复制此代码段.如果没有,请使用Ed的代码. (4认同)