【问题标题】:CSV export Function, what to do if string contains the character seperator?CSV导出功能,如果字符串中包含字符分隔符怎么办?
【发布时间】:2021-12-08 01:22:32
【问题描述】:

我使用函数将 Datatable 转换为 CSV,并使用 File.WriteAllText 将其保存到文件中。

    private static string DataTableToCSV(DataTable dtable, char seperator)
    {
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < dtable.Columns.Count; i++)
        {
            sb.Append(dtable.Columns[i]);
            if (i < dtable.Columns.Count - 1)
                sb.Append(seperator);
        }
        sb.AppendLine();
        foreach (DataRow dr in dtable.Rows)
        {
            for (int i = 0; i < dtable.Columns.Count; i++)
            {
                sb.Append(dr[i].ToString());
                if (i < dtable.Columns.Count - 1)
                {
                    sb.Append(seperator);
                }
            }
            sb.AppendLine();
        }
        return sb.ToString();
    }

好吧,代码正在运行。我的问题是,在 CSV 中,分隔符是 ';'。现在,当然,当表中的字符串包含分号时会发生错误。有没有一种优雅的方法来解决这个问题?

【问题讨论】:

    标签: c# csv datatable visual-studio-2019 stringbuilder


    【解决方案1】:

    您应该考虑使用库来为您处理 CSV 部分。当前接受的答案在值包含分隔符时处理引用,但是当值包含或以引号字符开头时会发生什么,或者如果值包含换行符怎么办?该方法将创建一个无效文件。事实上的 CSV standard 指定当值包含分隔符或换行符时应引用字段,并且引号应加倍以“转义”它们。

    有很多库可以帮助解决这个问题,包括我的作者:Sylvan.Data.Csv。 Sylvan 以非常直接的方式处理您的场景:

    using Sylvan.Data.Csv;
    
    static string DataTableToCSV(DataTable dtable, char seperator)
    {
        using var sw = new StringWriter();
        var opts = new CsvDataWriterOptions { Delimiter = seperator };
        using var csvw = CsvDataWriter.Create(sw, opts);
        csvw.Write(dtable.CreateDataReader());
        return sw.ToString();
    }
    

    【讨论】:

      【解决方案2】:

      我写了一个小助手来格式化我的 CSV 的每一行。

      private string FormatForCsv(string value) => value != null && value.Contains(';') ? value.Replace(value, "\"" + value + "\"") : value;
      

      那么你可以使用:

      sb.Append(FormatForCsv(dr[i]?.ToString()));
      

      当然,您也可以对标题使用相同的内容。

      为了安全起见,在将dr[i] 转换为字符串时,我还添加了一个空检查。

      【讨论】:

      • 非常感谢,完美! \ 在开头和结尾是字符串的分隔符吗?
      猜你喜欢
      • 2015-11-02
      • 2021-02-07
      • 2016-05-01
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 2015-11-01
      相关资源
      最近更新 更多