Экспорт С# DataSet в текстовый файл
В Интернете есть много примеров того, как заполнить 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, поэтому не нужно беспокоиться о нескольких таблицах данных.
EDIT: Когда я сказал "читаемый", я имел в виду читаемый человеком.
Спасибо заранее.
Ответы
Ответ 1
Это должно содержать текст шрифта с фиксированной длиной текста, но это означает, что он будет обрабатывать полный 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();
}
}
Ответ 2
лучше экспортировать данные в XML-формат.
У набора данных есть метод для этой работы:
DataSet ds = new DataSet();
ds.WriteXml(fileName);
вы можете прочитать xml и заполнить данные набора данных, как показано ниже:
DataSet ds = new DataSet();
ds.ReadXml(fileName);
Ответ 3
что бы я сделал:
foreach (DataRow row in myDataSet.Tables[0].Rows)
{
foreach (object item in row.ItemArray)
{
myStreamWriter.Write((string)item + "\t");
}
myStreamWriter.WriteLine();
}
Может быть, добавьте имена столбцов перед циклами, если вы хотите заголовки. То, что я думаю, хотя и довольно простой, должно сделать трюк.
Ответ 4
как насчет ниже?
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();
}
Ответ 5
Просто перебирайте строки вашей таблицы данных и добавляйте строки в свой файл, как в приведенном примере
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, где вы хотите сохранить данные. Где проблема на самом деле?
Ответ 6
Я новичок в индустрии программного обеспечения и просто пытаюсь помочь вам. Это не может быть конечным решением вашей проблемы.
Я прочитал ссылку, которую вы наделали. Это правда, что его единственный экспорт в формате запятой делимитирован. Если вы хотите экспортировать, как и вы, вы должны предпринять дополнительные усилия. 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();
}
Надеюсь, вы найдете это полезным.