导出一个c#数据集到一个文本文件
本文关键字:一个 文本 文件 数据集 | 更新日期: 2023-09-27 18:06:35
网上有很多关于如何从文本文件填充数据集的例子,但我想做相反的事情。我唯一能找到的是这个,但它似乎…不完整?
我希望它是一个可读的格式,不只是逗号分隔,所以每一行的列之间不相等的间距,如果这是有意义的。下面是我的意思的一个例子:
Column1 Column2 Column3
Some info Some more info Even more info
Some stuff here Some more stuff Even more stuff
Bits and bobs
注意:我只有一个数据表在我的数据集,所以不需要担心多个数据表。
编辑:我说的"可读"是指人类可读。
这应该可以很好地分隔固定长度的字体文本,但它确实意味着它将处理完整的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有一个方法:
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。根据第一步计算的宽度设置格式。
List<int> ColumnLengths = new List<int>();
ds.Tables["TableName"].Columns.Cast<DataColumn>().All((x) =>
{
{
ColumnLengths.Add( ds.Tables["TableName"].AsEnumerable().Select(y => y.Field<string>(x).Length).Max());
}
return true;
});
foreach (DataRow row in ds.Tables["TableName"].Rows)
{
for(int col=0;col<ds.Tables["TableName"].Columns.Count;col++)
{
SW.Write(row.Field<string>(ds.Tables["TableName"].Columns[col]).PadLeft(ColumnLengths[col] + (4 - (ColumnLengths[col] % 4))));
}
SW.WriteLine();
}