Экспорт набора данных C # в текстовый файл - PullRequest
17 голосов
/ 24 августа 2011

В Интернете много примеров того, как заполнить DataSet из текстового файла, но я хочу сделать обратное.Единственное, что мне удалось найти, это это , но оно кажется ... неполным?

Я хочу, чтобы оно было в удобочитаемом формате, а не только через запятую, поэтому неравное расстояние между столбцами в каждой строке, если это имеет смысл.Вот пример того, что я имею в виду:

Column1          Column2          Column3
Some info        Some more info   Even more info
Some stuff here  Some more stuff  Even more stuff
Bits             and              bobs

Примечание: у меня есть только один DataTable в моем DataSet, поэтому не нужно беспокоиться о нескольких DataTables.

РЕДАКТИРОВАТЬ: Когда я сказал «читаемый»«Я имел в виду читабельное человеческое.

Заранее спасибо.

Ответы [ 6 ]

17 голосов
/ 24 августа 2011

Это должно хорошо распределять текст шрифта фиксированной длины, но это означает, что он будет обрабатывать полный 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();
        }
    }
8 голосов
/ 24 августа 2011

лучше экспортировать данные в формат xml.

набор данных имеет метод для этой работы:

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

вы можете прочитать данные XML и заполнить набор данных, как показано ниже:

DataSet ds = new DataSet(); 
ds.ReadXml(fileName);
6 голосов
/ 24 августа 2011

я бы сделал следующее:

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

Возможно, добавьте имена столбцов перед циклами, если вы хотите заголовки.Это, я думаю, хотя и довольно просто, но должно сработать.

2 голосов
/ 24 августа 2011

как насчет ниже?

 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();
        }
0 голосов
/ 24 августа 2011

Я новичок в индустрии программного обеспечения и просто пытаюсь вам помочь. Возможно, это не является окончательным решением вашей проблемы.

Я прочитал ссылку, которую вы упомянули. Это правда, что это единственный экспорт в формате с разделителями-запятыми. Если вы хотите экспортировать как вы, вы должны предпринять некоторые дополнительные усилия. 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();
        }

Надеюсь, вы найдете это полезным.

0 голосов
/ 24 августа 2011

Просто переберите строки вашей таблицы данных и добавьте строки в файл, как в примере, приведенном

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 для файла, в который вы собираетесь сохранять данные. Где проблема на самом деле?

...