Export a C# DataSet to a text file

一曲冷凌霜 提交于 2019-11-29 01:23:02

This should space out fixed length font text nicely, but it does mean it will process the full DataTable twice (pass 1: find longest text per column, pass 2: output text):

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

it is better that you export your data to xml format.

dataset have a method for this work :

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

you can read a xml and fill dataset data like below :

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

what I would do is:

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

Maybe add column names before the loops if you want the headers. That I think, although being rather simple, should do the trick.

what about the below?

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

Just iterate over the rows of your data table and add lines to your file, like in example provided

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

}

Where sw is a StreamWriter to file where you're gonna to save data. Where is a problem actually ?

I am beginner in software industry and just trying to help you. This may not be an end solution to your problem.

I have read the link you mensioned. Its true that its only exporting in comma delimeted format. If you want to export like you mension you have to take some extra efforts. LINQ will reduce your work to great extend. what you have to do is: 1)Calculate the max width of each column in data table (using LINQ this can be done in one statement itself otherwise you have to take help of foreach). 2)before wrinting actual cell value to text file use String.Format to position according to calculated width in 1st step.

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

Hope you will find this helpful.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!