2

这是我第一次对平面文件进行任何类型的工作。我需要这是一个纯 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);是否可以删除最后一个,这,是我能想到的唯一方法。有什么建议么?

4

2 回答 2

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
    }
}
于 2012-06-05T11:15:55.707 回答
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 - 问题较少(理论上,尽管您仍然需要处理带有标签的数据)。

于 2012-06-05T11:17:37.667 回答