如何在c#中划分或分割数据表
本文关键字:分割 数据表 划分 | 更新日期: 2023-09-27 18:14:30
我想分割DataTable,这样我就可以把它的数据块从一个地方上传到另一个地方。
例如
选择前100行。
选择接下来的100行。
选择接下来的100行,以此类推…
是否有办法做到这一点,就像光标在数据库?我不喜欢使用循环等计数行
YourDataTable.Select()
给出了一个Data数组
linq呢?
以YourDataTable.Select (x => x).Take (100).ToEnumerable()
为例,DataRows
为前100个,YourDataTable.Select (x => x).Skip(100).Take (100).ToEnumerable()
为后100个。
试试这个:
public static class DataExtensions
{
public static IEnumerable<IEnumerable<DataRow>> Partition(this DataTable dataTable, int partitionSize)
{
var numRows = Math.Ceiling((double)dataTable.Rows.Count);
for(var i = 0; i < numRows / partitionSize; i++)
{
yield return Partition(dataTable, i * partitionSize, i * partitionSize + partitionSize);
}
}
private static IEnumerable<DataRow> Partition(DataTable dataTable, int index, int endIndex)
{
for(var i = index; i < endIndex && i < dataTable.Rows.Count; i++)
{
yield return dataTable.Rows[i];
}
}
}
var partitions = dataTable.Partition(100);
做:dataTable.Skip(0).Take(100);
dataTable.Skip(100).Take(100);
dataTable.Skip(200).Take(100);
dataTable.Skip(300).Take(100);
将迭代0次,并在第一次执行时使用100。然后迭代100行,取100行,然后迭代200行,再取100行,以此类推。
上面的代码将执行一个延迟取回操作,并且每一行只访问一次
这是一种简单的方法:
public DataSet test(DataSet ds, int max)
{
int i = 0;
int j = 1;
DataSet newDs = new DataSet();
DataTable newDt = ds.Tables[0].Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
foreach (DataRow row in ds.Tables[0].Rows)
{
DataRow newRow = newDt.NewRow();
newRow.ItemArray = row.ItemArray;
newDt.Rows.Add(newRow);
i++;
if (i == max)
{
newDs.Tables.Add(newDt);
j++;
newDt = ds.Tables[0].Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
i = 0;
}
}
return newDs;
}
你能试试吗?
使用linq选择部分记录堆栈溢出中的这个链接可能很有帮助用LINQ拆分一个集合为n个部分?
检查:从c-sharpcorner.com将大数据表分成小批量
internal static List<datatable> SplitTable(DataTable originalTable, int batchSize)
{
List<datatable> tables = new List<datatable>();
DataTable new_table = new DataTable();
new_table = originalTable.Clone();
int j = 0;
int k = 0;
if (originalTable.Rows.Count <= batchSize)
{
new_table.TableName = "Table_" + k;
new_table = originalTable.Copy();
tables.Add(new_table.Copy());
}
else
{
for (int i = 0; i < originalTable.Rows.Count; i++)
{
new_table.NewRow();
new_table.ImportRow(originalTable.Rows[i]);
if ((i + 1) == originalTable.Rows.Count)
{
new_table.TableName = "Table_" + k;
tables.Add(new_table.Copy());
new_table.Rows.Clear();
k++;
}
else if (++j == batchSize)
{
new_table.TableName = "Table_" + k;
tables.Add(new_table.Copy());
new_table.Rows.Clear();
k++;
j = 0;
}
}
}
return tables;
}
Improving on @vanessa
public DataSet SplitDataTable(DataTable tableData, int max)
{
int i = 0;
int j = 1;
int countOfRows = tableData.Rows.Count;
DataSet newDs = new DataSet();
DataTable newDt = tableData.Clone();
newDt.TableName = tableData.TableName+"_" + j;
newDt.Clear();
foreach (DataRow row in tableData.Rows)
{
DataRow newRow = newDt.NewRow();
newRow.ItemArray = row.ItemArray;
newDt.Rows.Add(newRow);
i++;
countOfRows--;
if (i == max )
{
newDs.Tables.Add(newDt);
j++;
newDt = tableData.Clone();
newDt.TableName = tableData.TableName + "_" + j;
newDt.Clear();
i = 0;
}
if (countOfRows == 0 && i < max)
{
newDs.Tables.Add(newDt);
j++;
newDt = tableData.Clone();
newDt.TableName = tableData.TableName + "_" + j;
newDt.Clear();
i = 0;
}
}
return newDs;
}