Raja Ganapathy Ответов: 4

Как разбить таблицу данных с помощью C#?


Я использую ASEnumerable() funtion, но dataset.datatable-это invalid argument error occur. я включаю System.linq; пространство имен и system.data.extensions.dll и нужная dll для моего проекта но все равно показывает эту ошибку

я попробую этот код
List<datatable> result = DTHead.AsEnumerable()
            .GroupBy(row => row.Field<int>("MIVID"))
            .Select(g => g.CopyToDataTable())
            .ToList();

Karthik_Mahalingam

DTHead-это datatable или dataset?

Raja Ganapathy

объект DataTable

Karthik_Mahalingam

Всегда использовать  Ответить  кнопка, чтобы отправить комментарии / запрос пользователю, чтобы пользователь получил уведомление и ответил на ваш текст.

Raja Ganapathy

DS_test.Таблицы[0].Столбцы.Рассчитывать;

как разделить количество столбцов мудро.

Karthik_Mahalingam

проверил код, он не бросает никаких исключений, может быть, вы что-то упускаете и не говорите.

Maciej Los

Согласитесь!

Raja Ganapathy

у меня есть n номеров столбцов, которые я хочу разделить на первые 24 столбца и строки из таблицы данных.Как это сделать.

Karthik_Mahalingam

после раскола что вы должны сделать

Raja Ganapathy

После разделения я храню таблицу в одной таблице и храню другие столбцы и строки в другой таблице.
И первая таблица для транспонирования.после транспонирования объединить две таблицы и генерировать XML. :(

Karthik_Mahalingam

:(

Raja Ganapathy

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

var totalRows = DS_test.Таблицы[0].Строк.Рассчитывать;
DataTable halfway = новый DataTable();
на полпути = DS_test.Таблицы[0].Колонны (24);
ВАР первойполовине = DS_test.Таблицы[0].Методом asenumerable().Возьмите(на полпути).CopyToDataTable();
ВАР второйполовине = DS_test.Таблицы[0].Методом asenumerable().Пропустить(наполовину).Берите(общее количество - полпути).CopyToDataTable();

Raja Ganapathy

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

Karthik_Mahalingam

Сплит-это хорошо, но транспонировать?

Raja Ganapathy

: (горизонтальное разделение возможно только по строкам.

Karthik_Mahalingam

приведите какой-нибудь пример

Raja Ganapathy

я буду использовать код Маниш.в таблице 47 столбцов 45 строк я даю диапазон индексов 24, но таблица, разделенная по строкам, означает 47 столбцов и 24 строки.и еще одна таблица 21 строка 47 столбцов

Karthik_Mahalingam

так как же вы хотите разделиться

Raja Ganapathy

я хочу разделить 24 столбца и 45 строк.

Karthik_Mahalingam

и хранить в 2 datatble?

Raja Ganapathy

с

Karthik_Mahalingam

ладно.

Karthik_Mahalingam

как организованы имена столбцов?

Raja Ganapathy

F1, F2, F3 ... до конца.

Karthik_Mahalingam

Проверьте мое решение

Raja Ganapathy

Успех работы полностью благодарю вас!

Karthik_Mahalingam

хороший

4 Ответов

Рейтинг:
36

Maciej Los

Что ж... Ваш код выглядит хорошо. Я протестировал вышеописанный запрос, и он работает так, как ожидалось. Видеть:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(int)));
dt.Columns.Add(new DataColumn("Note", typeof(string)));

dt.Rows.Add(new object[]{1, "A"});
dt.Rows.Add(new object[]{1, "B"});
dt.Rows.Add(new object[]{1, "C"});
dt.Rows.Add(new object[]{2, "D"});
dt.Rows.Add(new object[]{2, "E"});
dt.Rows.Add(new object[]{2, "F"});
dt.Rows.Add(new object[]{3, "G"});
dt.Rows.Add(new object[]{3, "H"});
dt.Rows.Add(new object[]{3, "I"});
dt.Rows.Add(new object[]{4, "J"});
dt.Rows.Add(new object[]{4, "K"});
dt.Rows.Add(new object[]{4, "L"});

//1. method
List<datatable> result = dt.AsEnumerable()
		.GroupBy(x=>x.Field<int>("ID"))
		.Select(grp=>grp.CopyToDataTable())
		.ToList();


////2. method
//var result = dt.AsEnumerable()
//		.GroupBy(x=>x.Field<int>("ID"))
//		.ToList();
//
//List<datatable> dts = new List<datatable>();
//foreach(var d in result)
//{
//	dts.Add(d.CopyToDataTable());
//}</datatable></datatable></int></int></datatable>


"Invalid agument"ошибку легко устранить. Таким образом, вы должны отладить свою программу, чтобы выяснить, где произошла ошибка.
А пока, пожалуйста, прочтите это: Недопустимый вызов процедуры или аргумент (Ошибка 5)[^]

[РЕДАКТИРОВАТЬ]
Раджа Ганапати писал:

[в комментарии к решению 1]
у меня есть n номеров столбцов, которые я хочу разделить на первые 24 столбца и строки из таблицы данных.Как это сделать.


Если вы хотите получить только несколько столбцов, замените их:
.Select(grp=>grp.CopyToDataTable())

с
.Select(grp=>grp.Select(a=>new{ 
    Col1 = a.Field<Type>("Name1"),
    Col2 = a.Field<Type>("Name2"),
    ...
    ColN = a.Field<Type>("NameN")
    }).CopyToDataTable())

[/РЕДАКТИРОВАТЬ]


Рейтинг:
23

manishbg

//this is datatable demo

DataTable  tbl = new DataTable();
tbl.Columns.Add("Column");
for(int i=0; i < 61; i++)
    tbl.Rows.Add(i.ToString());



DataTable[] splittedtables = tbl.AsEnumerable()
    .Select((row, index) => new { row, index })
    .GroupBy(x => x.index / 12)  // integer division, the fractional part is truncated
    .Select(g => g.Select(x => x.row).CopyToDataTable())
    .ToArray();


Maciej Los

На мой взгляд, этот кусок кода не поможет. Пожалуйста, прочтите мой ответ.

Raja Ganapathy

у меня есть n номеров столбцов, которые я хочу разделить на первые 24 столбца и строки из таблицы данных.Как это сделать.

Maciej Los

Пожалуйста, смотрите обновленный ответ (Решение 2)

manishbg

DataTable[] splittedtables = tbl.Методом asenumerable()
.Выберите((строка, индекс) =>, новые { строки, показатель })
. GroupBy(x => x. index / 24) / / целочисленное деление, дробная часть усекается
.Выберите(г =&ГТ; г. Выберите(х => У Х.подряд).CopyToDataTable())
.Метод toArray();

использовать это

Raja Ganapathy

Как хранить разделенные столбцы и строки.

manishbg

хранилище данных в массиве

Raja Ganapathy

Спасибо, Маниш, это разделено по горизонтали. как это сделать по вертикали.

Рейтинг:
13

Karthik_Mahalingam

обратитесь к этому примеру и разделите столбцы на отдельные таблицы внутри набора данных.

DataTable dtMain = new DataTable();
       for (int i = 1; i <= 10; i++)
           dtMain.Columns.Add("col" + i);
       dtMain.Rows.Add(1);


       string[] columnNames = dtMain.Columns.OfType<DataColumn>().Select(k => k.ColumnName).ToArray();
       List<List<string>> lst = new List<List<string>>();


       int splitby = 3;

       int colCount = dtMain.Columns.Count;
       int splitCount = (colCount / splitby) + ((colCount % splitby) > 0 ? 1 : 0);

       for (int i = 0; i < splitCount; i++)
           lst.Add(columnNames.Skip(i * splitby).Take(splitby).ToList()); ;




       DataSet dsFinal = new DataSet();
       for (int i = 0; i < lst.Count; i++)
       {
           DataTable dtTemp = dtMain.Copy();
           dtTemp.TableName = "split" + i.ToString();
           columnNames.Except(lst[i]).ToList().ForEach(col => dtTemp.Columns.Remove(col));
           dtTemp.AcceptChanges();
           dsFinal.Tables.Add(dtTemp);

       }


Raja Ganapathy

Спасибо вам всем.

Рейтинг:
1

manishbg

<pre lang="C#">DataTable tbl = new DataTable();
            tbl.Columns.Add("Column");
            for (int i = 0; i < 61; i++)
                tbl.Rows.Add(i.ToString());



            DataTable[] splittedtables = tbl.AsEnumerable()
                .Select((row, index) => new { row, index })
                .GroupBy(x => x.index / 12)  // integer division, the fractional part is truncated
                .Select(g => g.Select(x => x.row).CopyToDataTable())
                .ToArray();


DataTable dtarr1 = splittedtables[0];


Richard Deeming

Если вы хотите обновить свой ответ, нажмите кнопку "улучшить решение". Не публикуйте свое обновление как новое решение!