将C#DataSet导出到文本文件

时间:2011-08-24 10:38:00

标签: c# dataset export text-files

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

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

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。

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

提前致谢。

6 个答案:

答案 0 :(得分:17)

这应该很好地区分固定长度的字体文本,但它确实意味着它将处理完整的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();
        }
    }

答案 1 :(得分:8)

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

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

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

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

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

答案 2 :(得分:6)

我会做的是:

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

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

答案 3 :(得分:2)

下面怎么样?

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

答案 4 :(得分:0)

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

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,用于存档您要保存数据的位置。实际上问题在哪里?

答案 5 :(得分:0)

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

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

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

希望你会发现这有用。