这是我第一次使用平面文件进行任何工作。 我需要这是一个普通的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);
会移除最后,
,这是我能想到的唯一方式。
有什么建议吗?
答案 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 - 问题较少(理论上,尽管您仍然需要处理带有标签的数据)。