如何使用C#拆分数据表? [英] How to split the data table using C#?

查看:84
本文介绍了如何使用C#拆分数据表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 ASEnumerable()功能,但dataset.datatable是发生无效参数错误。我包括 System.linq; 命名空间和 system.data.extensions.dll 以及我项目所需的dll但仍然显示此错误



i将尝试此代码

列表< datatable> result = DTHead.AsEnumerable()
.GroupBy(row = > row.Field< int>( MIVID))
。选择(g = > g.CopyToDataTable ())
.ToList();

解决方案

嗯......你的代码看起来不错。我测试了上面的查询,它按预期工作。请参阅:

 DataTable dt =  new  DataTable(); 
dt.Columns.Add( new DataColumn( ID typeof int )));
dt.Columns.Add( new DataColumn( 注意 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。方法
List< datatable> result = dt.AsEnumerable()
.GroupBy(x => x.Field< int>( ID))
。选择(grp => grp.CopyToDataTable())
.ToList();


/// / 2。方法
// var result = dt.AsEnumerable()
// 。GroupBy(x => x.Field< int>(ID))
// .ToList();
//
// 列表与LT;数据表> dts = new List< datatable>();
// foreach(结果中的var d )
// {
// dts.Add(d.CopyToDataTable());
/ / }< / datatable>< / datatable>< / int>< / int>< / datatable>





无效的文件错误很容易解决。因此,您必须调试程序以找出错误发生的位置。

同时请阅读:无效的程序调用或参数(错误5) [ ^ ]



]

Raja Ganapathy写道:



[在评论中解决方案1]

i浏览你的代码sir.i有n个列我想从数据表中拆分前24列和行。怎么做。





如果你想只获得几列,请替换:

。选择(grp => grp.CopyToDataTable( ))



with

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



[/ EDIT]


< blockquote>

  //  这是数据表演示 

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 // 整数除法,小数部分被截断
。选择(g = > g。选择(x = > x.row).CopyToDataTable())
.ToArray();


参考此示例并将列拆分为数据集内的单独表。



 DataTable dtMain =  new  DataTable(); 
for int i = 1 ; i < = 10 ; i ++)
dtMain.Columns.Add(< span class =code-string> col + i);
dtMain.Rows.Add( 1 );


string [] columnNames = dtMain.Columns.OfType< DataColumn>()。选择(k = > k.ColumnName)。ToArray();
列表< List< string>> lst = new 列表< List< string>>();


int splitby = 3 ;

int colCount = dtMain.Columns.Count;
int splitCount =(colCount / splitby)+((colCount%splitby)> < span class =code-digit> 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);

}


I use the ASEnumerable() funtion, but dataset.datatable is invalid argument error occur. i include System.linq; namespace and system.data.extensions.dll and the needed dll to my project but still show this error

i will try this code

List<datatable> result = DTHead.AsEnumerable()
            .GroupBy(row => row.Field<int>("MIVID"))
            .Select(g => g.CopyToDataTable())
            .ToList();

解决方案

Well... Your code looks good. I tested above query and it works as expected. See:

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" error is easy to resolve. So, you have to debug your programme to find out where the error occur.
In the meanwhile, please read this: Invalid procedure call or argument (Error 5)[^]

[EDIT]

Raja Ganapathy wrote:


[in the comment to the solution1]
i go through your code sir.i have n numbers of columns i want to split first 24 columns and rows from the data table.How to do it.



If you want to get only few columns, replace:

.Select(grp=>grp.CopyToDataTable())


with

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


[/EDIT]


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


refer this example and split the columns to a separate tables inside dataset.

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

       }


这篇关于如何使用C#拆分数据表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆