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

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

因此,如果我有一个string它就变成了一个"string" …如果该值已经引用,则它们将替换为双引号。 例如, str"ing变成"str""ing" ……

但是,最近由于以下情况,我的导入失败了

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

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

 """"",""word1,word2,...""" 

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

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

更新

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

我使用这个代码,它一直有效:

 ///  /// Turn a string into a CSV cell output ///  /// String to output /// The CSV cell formatted string 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; } 

根据Ed Bayiates的回答:

 ///  /// Turn a string into a CSV cell output ///  /// String to output /// The CSV cell formatted string 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); } 

我的便士想:

 String[] lines = new String[] { "\"\",\"word\",word,word2,1,34,5,2,\"details\"" }; for (int j = 0; j < lines.Length; j++) { String[] fields=lines[j].Split(','); for (int i =0; i 

}

根据“Ed Bayiates”的贡献,这里是一个有用的类来补充csv文件:

 ///  /// helpful class to build csv document ///  public class CsvBuilder { ///  /// create the csv builder ///  public CsvBuilder(char csvSeparator) { m_csvSeparator = csvSeparator; } ///  /// append a cell ///  public void appendCell(string strCellValue) { if (m_nCurrentColumnIndex > 0) m_strBuilder.Append(m_csvSeparator); bool mustQuote = (strCellValue.Contains(m_csvSeparator) || strCellValue.Contains('\"') || strCellValue.Contains('\r') || strCellValue.Contains('\n')); if (mustQuote) { m_strBuilder.Append('\"'); foreach (char nextChar in strCellValue) { m_strBuilder.Append(nextChar); if (nextChar == '"') m_strBuilder.Append('\"'); } m_strBuilder.Append('\"'); } else { m_strBuilder.Append(strCellValue); } m_nCurrentColumnIndex++; } ///  /// end of line, new line ///  public void appendNewLine() { m_strBuilder.Append(Environment.NewLine); m_nCurrentColumnIndex = 0; } ///  /// Create the CSV file ///  ///  public void save(string path ) { File.WriteAllText(path, ToString()); } public override string ToString() { return m_strBuilder.ToString(); } private StringBuilder m_strBuilder = new StringBuilder(); private char m_csvSeparator; private int m_nCurrentColumnIndex = 0; } 

如何使用它:

 void exportAsCsv( string strFileName ) { CsvBuilder csvStringBuilder = new CsvBuilder(';'); csvStringBuilder.appendCell("#Header col 1 : Name"); csvStringBuilder.appendCell("col 2 : Value"); csvStringBuilder.appendNewLine(); foreach (Data data in m_dataSet) { csvStringBuilder.appendCell(data.getName()); csvStringBuilder.appendCell(data.getValue()); csvStringBuilder.appendNewLine(); } csvStringBuilder.save(strFileName); } 

解析这个的第一步是删除你的字符串周围额外添加的“。”一旦你这样做,你应该能够处理嵌入的“以及”。

经过深思熟虑后,决定需要修复导入实用程序格式。 字符串的转义是正确的(如用户所示)但导入实用程序使用的格式文件不正确并导致它导致导入中断。

谢谢大家特别感谢@dbt(投票)