将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(); }
希望你会发现这很有帮助。