将C#DataSet导出到文本文件

网上有很多关于如何从文本文件中填充DataSet的例子,但我想反过来。 我唯一能找到的就是这个,但似乎……不完整?

我希望它是一种可读格式,而不仅仅是逗号分隔,因此如果有意义的话,每行上的列之间的间距不相等。 这是我的意思的一个例子:

Column1 Column2 Column3 Some info Some more info Even more info Some stuff here Some more stuff Even more stuff Bits and bobs 

注意:我的DataSet中只有一个DataTable,因此无需担心多个DataTable。

编辑:当我说“可读”时,我的意思是人类可读。

提前致谢。

这应该很好地区分固定长度的字体文本,但它确实意味着它将处理完整的DataTable两次(传递1:每列找到最长的文本,传递2:输出文本):

  static void Write(DataTable dt, string outputFilePath) { int[] maxLengths = new int[dt.Columns.Count]; for (int i = 0; i < dt.Columns.Count; i++) { maxLengths[i] = dt.Columns[i].ColumnName.Length; foreach (DataRow row in dt.Rows) { if (!row.IsNull(i)) { int length = row[i].ToString().Length; if (length > maxLengths[i]) { maxLengths[i] = length; } } } } using (StreamWriter sw = new StreamWriter(outputFilePath, false)) { for (int i = 0; i < dt.Columns.Count; i++) { sw.Write(dt.Columns[i].ColumnName.PadRight(maxLengths[i] + 2)); } sw.WriteLine(); foreach (DataRow row in dt.Rows) { for (int i = 0; i < dt.Columns.Count; i++) { if (!row.IsNull(i)) { sw.Write(row[i].ToString().PadRight(maxLengths[i] + 2)); } else { sw.Write(new string(' ', maxLengths[i] + 2)); } } sw.WriteLine(); } sw.Close(); } } 

最好将数据导出为xml格式。

数据集有一个方法来完成这项工作:

 DataSet ds = new DataSet(); ds.WriteXml(fileName); 

您可以读取xml并填充数据集数据,如下所示:

 DataSet ds = new DataSet(); ds.ReadXml(fileName); 

我会做的是:

 foreach (DataRow row in myDataSet.Tables[0].Rows) { foreach (object item in row.ItemArray) { myStreamWriter.Write((string)item + "\t"); } myStreamWriter.WriteLine(); } 

如果你想要标题,可以在循环之前添加列名。 我认为,虽然相当简单,但应该做到这一点。

下面怎么样?

  public static void Write(DataTable dt, string filePath) { int i = 0; StreamWriter sw = null; sw = new StreamWriter(filePath, false); for (i = 0; i < dt.Columns.Count - 1; i++) { sw.Write(dt.Columns[i].ColumnName + " "); } sw.Write(dt.Columns[i].ColumnName); sw.WriteLine(); foreach (DataRow row in dt.Rows) { object[] array = row.ItemArray; for (i = 0; i < array.Length - 1; i++) { sw.Write(array[i] + " "); } sw.Write(array[i].ToString()); sw.WriteLine(); } sw.Close(); } 

只需迭代数据表的行并向文件添加行,就像提供的示例一样

 foreach (DataRow row in dt.Rows) { object[] array = row.ItemArray; for (i = 0; i < array.Length - 1; i++) { sw.Write(array[i].ToString() + ";"); } sw.Write(array[i].ToString()); sw.WriteLine(); } 

其中sw是StreamWriter,用于存档您要保存数据的位置。 实际上问题出在哪里?

我是软件行业的初学者,只是想帮助你。 这可能不是您问题的最终解决方案。

我已经阅读了你所宣传的链接。 确实,它只能以逗号分隔格式导出。 如果你想像你一样出口,你必须付出额外的努力。 LINQ将大大减少您的工作量。 你要做的是:1)计算数据表中每列的最大宽度(使用LINQ,这可以在一个语句本身完成,否则你必须得到foreach的帮助)。 2)在将实际单元格值写入文本文件之前,使用String.Format在第1步中根据计算出的宽度进行定位。

 List ColumnLengths = new List(); ds.Tables["TableName"].Columns.Cast().All((x) => { { ColumnLengths.Add( ds.Tables["TableName"].AsEnumerable().Select(y => y.Field(x).Length).Max()); } return true; }); foreach (DataRow row in ds.Tables["TableName"].Rows) { for(int col=0;col(ds.Tables["TableName"].Columns[col]).PadLeft(ColumnLengths[col] + (4 - (ColumnLengths[col] % 4)))); } SW.WriteLine(); } 

希望你会发现这很有帮助。