在平面文件中存储DataTable

时间:2012-06-05 11:12:16

标签: c#

这是我第一次使用平面文件进行任何工作。 我需要这是一个普通的txt文件而不是XML。

我已经写了以下选择逗号分隔格式。

    public static void DataTableToFile(string fileLoc, DataTable dt)
    {
        StringBuilder str = new StringBuilder();
        // get the column headers
        foreach (DataColumn c in dt.Columns)
        {
            str.Append(c.ColumnName.ToString() + ",");
        }
        str.Remove(str.Length-1, 1);
        str.AppendLine();
        // write the data here
        foreach (DataRow dr in dt.Rows)
        {
            foreach (var field in dr.ItemArray)
            {
                str.Append(field.ToString() + ",");
            }
            str.Remove(str.Length-1, 1);
            str.AppendLine();
        }
        try
        {
            Write(fileLoc, str.ToString());
        }
        catch (Exception ex)
        {
            //ToDO:Add error logging
        }
    }

我的问题是:我可以做得更好还是更快? 并且str.Remove(str.Length-1, 1);会移除最后,,这是我能想到的唯一方式。 有什么建议吗?

2 个答案:

答案 0 :(得分:3)

使用

public static void DataTableToFile(string fileLoc, DataTable dt)
{
    StringBuilder str = new StringBuilder();

    // get the column headers
    str.Append(String.Join(",", dt.Columns.Cast<DataColumn>()
                                      .Select(col => col.ColumnName)) + "\r\n");

    // write the data here
    dt.Rows.Cast<DataRow>().ToList()
           .ForEach(row => str.Append(string.Join(",", row.ItemArray) + "\r\n"));

    try
    {
        Write(fileLoc, str.ToString());
    }
    catch (Exception ex)
    {
        //ToDO:Add error logging
    }
}

答案 1 :(得分:3)

关键点是:没有必要使用StringBuilder在内存中构建它 - 您应该通过类似StreamWriter的内容写入文件,即通过File.CreateText 。该API类似于StringBuilder,但您不应尝试删除 - 而是不添加 - 即。

bool first = true;
foreach(...blah...) {
    if(first) { first = false; }
    else { writer.Write(','); }
    ... write the data ...
}

另一个考虑因素:CSV 只是添加逗号的情况。您需要考虑引用的文本(对于, in的数据)和多行数据。除非数据非常简单。您可能还希望使格式更明确,而不仅仅是.ToString(),这对文化非常敏感。典型的例子是使用,作为十进制字符的欧洲大部分地区,因此“CSV”通常使用不同的分隔符,以避免引用所有内容。如果选择可用,个人我总是使用TSV而不是CSV - 问题较少(理论上,尽管您仍然需要处理带有标签的数据)。