c# - 将 DataTable 转换为 CSV 流

标签 c# csv datatable

目前有一个 DataTable,但希望通过 WebHandler 将其流式传输给用户。 FileHelpersCommonEngine.DataTableToCsv(dt, "file.csv")。但是它将它保存到一个文件中。我怎样才能将它保存到流中呢?当我知道高级列或它们不会更改时,我知道该怎么做,但我想直接从数据表生成列标题。

如果我知道我只创建类的列:

[DelimitedRecord(",")]
public class MailMergeFields
{
    [FieldQuoted()]
    public string FirstName;
    [FieldQuoted()]
    public string LastName;
}

然后使用 FileHelperEngine 并添加记录:

FileHelperEngine engine = new FileHelperEngine(typeof(MailMergeFields));

MailMergeFields[] merge = new MailMergeFields[dt.Rows.Count + 1];

// add headers
merge[0] = new MailMergeFields();
merge[0].FirstName = "FirstName";
merge[0].LastName = "LastName";

int i = 1;              
// add records
foreach (DataRow dr in dt.Rows)
{
    merge[i] = new MailMergeFields();
    merge[i].FirstName = dr["Forename"];
    merge[i].LastName = dr["Surname"];
    i++;
}

最后写入流:

TextWriter writer = new StringWriter();
engine.WriteStream(writer, merge);
context.Response.Write(writer.ToString());

不幸的是,因为我事先不知道这些列,所以我无法事先创建类。

最佳答案

你可以自己快速写一些东西:

public static class Extensions
{
    public static string ToCSV(this DataTable table)
    {
        var result = new StringBuilder();
        for (int i = 0; i < table.Columns.Count; i++)
        {
            result.Append(table.Columns[i].ColumnName);
            result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
        }

        foreach (DataRow row in table.Rows)
        {
            for (int i = 0; i < table.Columns.Count; i++)
            {
                result.Append(row[i].ToString());
                result.Append(i == table.Columns.Count - 1 ? "\n" : ",");
            }
        }

        return result.ToString();
    }
}

并测试:

  public static void Main()
  {
        DataTable table = new DataTable();
        table.Columns.Add("Name");
        table.Columns.Add("Age");
        table.Rows.Add("John Doe", "45");
        table.Rows.Add("Jane Doe", "35");
        table.Rows.Add("Jack Doe", "27");
        var bytes = Encoding.GetEncoding("iso-8859-1").GetBytes(table.ToCSV());
        MemoryStream stream = new MemoryStream(bytes);

        StreamReader reader = new StreamReader(stream);
        Console.WriteLine(reader.ReadToEnd());
  }

编辑:回复您的评论:

这取决于您希望如何格式化您的 csv,但通常如果文本包含特殊字符,您希望将其用双引号引起来,即:“my,text”。您可以在创建 csv 的代码中添加检查以检查特殊字符,如果是,则用双引号将文本括起来。至于 .NET 2.0 的东西,只需在您的类中将其创建为辅助方法或在方法声明中删除 this 一词并像这样调用它:Extensions.ToCsv(table);

关于c# - 将 DataTable 转换为 CSV 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/888181/

相关文章:

c# - $.getJSON 不在回调中解析对象

c# - 在winforms中多次运行 "FFMPEG"

VB.NET:将 CSV 文件读入二维数组

javascript - 网页上动态更新表格的最简单实现(java/css)

c# - 如何显示datagridview中的所有行?

javascript - 从数据表中导出选定行的 csv 文件

c# - "Item has already been added. Key in dictionary"的解决方法每次都使用相同的 key 但具有不同的值

c# - 在 WPF 中使用 ItemsControl 时正确对齐控件

php - 在 PHP 中查询 mysql 并将数据导出为 CSV

PHP 日期列不从 csv 文件填充