【发布时间】:2018-03-16 08:14:40
【问题描述】:
我有一个 foreach 循环,我在其中从数据表创建一个 CSV 字符串。我正在使用 File.WriteAllText 方法将文件写入磁盘。 它在每次循环迭代后在指定路径上创建一个新的 .csv 文件,但每个新文件也包含其先前文件的数据。以下是我的示例代码:
foreach (string CIInfo in CiInformation)
{
string[] CIId = CIInfo.Split(',');
string query1 = "Some Query"
if (conn.State == ConnectionState.Open)
{
SqlCommand cmd = new SqlCommand(query1, conn);
cmd.CommandTimeout = 50000;
dt.Load(cmd.ExecuteReader());
}
string CSV = DataTableToCSV(dt, ',');
File.WriteAllText("D:\\NonMsCSV\\" + CIId[0] + ".csv", CSV);
有没有办法在每次迭代后创建一个新文件,该文件只包含它自己的数据而不是它的前任数据? 任何帮助将不胜感激。
public static string DataTableToCSV(DataTable datatable, char seperator)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < datatable.Columns.Count; i++)
{
sb.Append(datatable.Columns[i]);
if (i < datatable.Columns.Count - 1)
sb.Append(seperator);
}
sb.AppendLine();
foreach (DataRow dr in datatable.Rows)
{
for (int i = 0; i < datatable.Columns.Count; i++)
{
sb.Append(dr[i].ToString());
if (i < datatable.Columns.Count - 1)
sb.Append(seperator);
}
sb.AppendLine();
}
return sb.ToString();
}
【问题讨论】:
-
欢迎来到 SO。请访问stackoverflow.com/tour
-
你的代码没有格式化,不够用。请提供完整且正确的代码。
-
从文档DataTable.Load Method:如果 DataTable 已经包含行,则来自数据源的传入数据将与现有行合并。 所以你正在传递整个数据到 DataTableToCSV。
-
哈哈,现代 CSV 格式使用 \t 表示列,使用 \r\n 表示行 :) 想想吧。
-
@alerya,等什么?你有这种现代方式的规范吗?因为 rfc 4180 是明确的。
\t没有收益。如果列数据没有同一侧,您的文本文件中将不会显示表格。常见的 c# CSV lib 使用逗号作为默认分隔符。并且 Excel 中的 Copy past 参数被破坏了" "字段分隔符不会被修剪; CSV 清晰且定义明确。对于未来,IT 可能会使用 Csv 库并停止这种毫无意义的事情。我不明白为什么有人要更改分隔符,是否有人将 Json[{}]更改为~?