我必须从webservice输出创建一个CSV文件,CSV文件使用带逗号分隔符的带引号的字符串.我不能改变格式 ......
所以,如果我有一个string它变成了"string"......如果该值已经引用,则它们将替换为双引号.例如,str"ing变成"str""ing"......
但是,最近由于以下原因导致导入失败
"","word1,word2,...""""",""word1,word2,...""""""",""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)
根据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)