将C#数据集导出到文本文件

将C#数据集导出到文本文件,c#,dataset,export,text-files,C#,Dataset,Export,Text Files,网上有很多关于如何从文本文件填充数据集的例子,但我想做的恰恰相反。我唯一能找到的是,但似乎。。。不完整 我希望它是一种可读的格式,而不仅仅是逗号分隔的,所以如果有意义的话,每行上的列之间的间距是不相等的。以下是我的意思的一个例子: Column1 Column2 Column3 Some info Some more info Even more info Some stuff here Some more stuff Even more

网上有很多关于如何从文本文件填充数据集的例子,但我想做的恰恰相反。我唯一能找到的是,但似乎。。。不完整

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

Column1          Column2          Column3
Some info        Some more info   Even more info
Some stuff here  Some more stuff  Even more stuff
Bits             and              bobs
注意:我的数据集中只有一个数据表,所以不需要担心多个数据表

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


提前感谢。

最好将数据导出为xml格式

dataset有一个用于此工作的方法:

DataSet ds = new DataSet(); 
ds.WriteXml(fileName);
您可以读取xml并填充数据集数据,如下所示:

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

只需迭代数据表中的行并向文件中添加行,如所提供的示例所示

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();

}
foreach(数据行中的数据行)
{    
object[]数组=row.ItemArray;
对于(i=0;i
其中
sw
是用于保存数据的StreamWriter文件。问题到底出在哪里?

我要做的是:

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();
        }
publicstaticvoidwrite(DataTable dt,stringfilepath)
{
int i=0;
StreamWriter sw=null;
sw=新StreamWriter(文件路径,false);
对于(i=0;i
这将很好地将固定长度字体文本隔开,但这确实意味着它将处理完整的数据表两次(传递1:查找每列最长文本,传递2:输出文本):

静态无效写入(DataTable dt,string outputFilePath)
{
int[]maxLength=新的int[dt.Columns.Count];
对于(int i=0;i最大长度[i])
{
最大长度[i]=长度;
}
}
}
}
使用(StreamWriter sw=新StreamWriter(outputFilePath,false))
{
对于(int i=0;i
我是软件行业的初学者,我只是想帮助你们。这可能不是你问题的最终解决方案

我已经阅读了你标注的链接。确实,它只以逗号删除格式导出。如果你想出口像你的尺寸,你必须采取一些额外的努力。LINQ将大大减少您的工作量。您需要做的是:1)计算数据表中每一列的最大宽度(使用LINQ这可以在一条语句中完成,否则您必须借助foreach)。2) 在将实际单元格值写入文本文件之前,请使用String.Format根据第一步中计算的宽度进行定位

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();
        }
List columnLength=新列表();
ds.Tables[“TableName”].Columns.Cast().All((x)=>
{ 
{
添加(ds.Tables[“TableName”].AsEnumerable().Select(y=>y.Field(x.Length).Max());
} 
返回true;
});
foreach(ds.Tables[“TableName”].Rows中的DataRow行)
{

对于(int COL=0;COLYE确实知道它是用固定字体排列的,对吗?就像一个魅力。我不介意它在数据集中迭代两次,因为它只是很小的。考虑到这个解决方案的其他人可能想考虑使用大数据集的备选方案。谢谢,罗伊!@数据集中的SwethaVijayan PASS(例如:代码> DS < /代码>)作为参数而不是DataTable,然后在表示
foreach(dt.Rows中的DataRow)的行上方插入一行
foreach(ds.Tables中的DataTable dt)
谢谢我得到了解决方案,我使用了
for
而不是
foreach
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();
        }