DataSet的简单合并和DataTable的重复数据过滤

本文介绍了一种通过指定字段去除DataTable中重复记录的方法。该方法首先复制原始数据表,然后通过比较指定字段的值来确定哪些行是重复的,并删除这些重复行。此外,还提供了一个辅助方法用于比较两个对象是否相等。

public DataTable SelectDistinctByField(DataTable dt, string FieldName)
    {
        DataTable returnDt = new DataTable();
        returnDt = dt.Copy();//将原DataTable复制一个新的  
        DataRow[] drs = returnDt.Select("", FieldName);//将DataTable按指定的字段排序  
        object LastValue = null;
        for (int i = 0; i < drs.Length; i++)
        {
            if ((LastValue == null) || (!(ColumnEqual(LastValue, drs[i][FieldName]))))
            {
                LastValue = drs[i][FieldName];
                continue;
            }
            drs[i].Delete();
        }
        returnDt.AcceptChanges();
        return returnDt;
    }

    private bool ColumnEqual(object A, object B)
    {
        if (A == DBNull.Value && B == DBNull.Value)
            return true;
        if (A == DBNull.Value || B == DBNull.Value)
            return false;
        return (A.Equals(B));
    }

 

 

DataSet ds1 = ……

DataSet ds2 = ……

ds1.Merge(ds2);
DataTable ddt = SelectDistinctByField(ds1.Tables[0], "id");

<think>好的,用户现在想了解如何使用C#的DataSet API来拆分CSV数据。我需要先回忆一下C#中处理CSV的常见方法,以及DataSet的相关知识。用户之前的问题中提到了DataSet的基础操作、数据库交互、数据筛选等,现在转向CSV的处理。需要结合用户提供的引用内容,特别是引用[2][3],因为这两个引用涉及CSV处理文件操作。首先,用户可能想将CSV数据读入DataSet,然后进行拆分。但DataSet本身并没有直接读取CSV的功能,通常需要先读取CSV文件到DataTable,再添加到DataSet中。拆分数据可能是指按条件分割成多个DataTable,或者按行数分割。引用[2]中提到用Pandas处理CSV时遇到列数不一致的问题,用户可能也关心如何处理CSV格式问题,但用户现在的问题是关于C#的,所以可能需要转换思路,比如在C#中如何正确读取不规则的CSV文件,或者如何动态处理列数变化的情况。引用[3]是关于获取文件夹下CSV文件的方法,可能用户需要先读取多个CSV文件,再合并或拆分处理。但用户当前的问题主要是拆分CSV数据,所以可能需要先读取单个CSV文件到DataSet,然后进行拆分。接下来,我需要考虑如何用C#读取CSV。常见的方法有手动解析、使用TextFieldParser,或者第三方库如CsvHelper。考虑到用户可能希望使用原生方法,可能推荐使用TextFieldParser,或者简单的Split方法。然后,将CSV数据加载到DataTable中,再添加到DataSet。拆分的话,可能需要根据某些条件过滤行,或者按行数分割成多个DataTable。例如,按行数拆分成多个块,每个块作为一个新的DataTable存入DataSet。 用户可能需要示例代码,所以需要准备分步的示例,包括读取CSV、处理数据、拆分数据,并整合到DataSet中。同时,要注意引用之前的引用内容,比如引用[2]中的处理列数不一致的问题,可能在C#中也需要动态处理列,但用户的问题更关注拆分,所以可能需要先确保CSV结构正确。另外,用户提到的引用[1]是关于数据库查询的,可能不太相关,但用户现在的问题是关于CSV的,所以主要参考引用[2][3]。最后,生成相关问题,比如如何处理大型CSV文件,如何动态调整列,或者如何合并拆分后的数据,这些都需要根据示例内容来延伸。</think>### C# Dataset API拆分CSV数据方法详解 --- #### **1. CSV读取与DataSet集成** 使用`TextFieldParser`读取CSV文件并加载到DataSet中: ```csharp using Microsoft.VisualBasic.FileIO; // 需要引用Microsoft.VisualBasic DataSet ds = new DataSet("CSVData"); DataTable csvTable = new DataTable("MainData"); // 动态创建列(根据第一行) using (TextFieldParser parser = new TextFieldParser(@"data.csv")) { parser.TextFieldType = FieldType.Delimited; parser.SetDelimiters(","); // 读取表头 string[] headers = parser.ReadFields(); foreach (string header in headers) { csvTable.Columns.Add(header); } // 读取数据行 while (!parser.EndOfData) { string[] fields = parser.ReadFields(); csvTable.Rows.Add(fields); } } ds.Tables.Add(csvTable); // 数据加载到DataSet[^2] ``` --- #### **2. 按条件拆分数据** 基于特定列值分割数据集: ```csharp // 创建新表存储筛选结果 DataTable filteredTable = csvTable.Clone(); // 复制结构 var query = ds.Tables["MainData"].AsEnumerable() .Where(row => Convert.ToInt32(row["Quantity"]) > 100); foreach (DataRow row in query) { filteredTable.ImportRow(row); // 行转移操作 } ds.Tables.Add(filteredTable); // 添加拆分后的表 ``` --- #### **3. 按行数批量拆分** 将大数据集分割为固定大小的块: ```csharp int batchSize = 1000; int tableCount = 1; for (int i = 0; i < csvTable.Rows.Count; i += batchSize) { DataTable batchTable = csvTable.Clone(); IEnumerable<DataRow> rows = csvTable.AsEnumerable().Skip(i).Take(batchSize); foreach (DataRow row in rows) { batchTable.ImportRow(row); } ds.Tables.Add($"Batch_{tableCount++}"); // 生成分块表[^3] } ``` --- #### **4. 动态列处理技巧** 处理列数不一致的CSV文件(参考引用[2]思路): ```csharp // 获取最大列数 int maxColumns = File.ReadLines("data.csv") .Select(line => line.Split(',').Length) .Max(); // 动态创建列 for (int i = 0; i < maxColumns; i++) { csvTable.Columns.Add($"Column_{i}"); } // 填充数据时处理缺失值 while (!parser.EndOfData) { string[] fields = parser.ReadFields(); Array.Resize(ref fields, maxColumns); // 统一列数 csvTable.Rows.Add(fields); } ``` --- ### 性能对比 | 拆分方式 | 时间复杂度 | 适用场景 | |----------------|------------------|------------------------| | 条件筛选 | $O(n)$ | 基于业务规则的分割 | | 固定行数分块 | $O(n)$ | 批量处理/分页显示 | | 动态列调整 | $O(n \log n)$ | 非结构化CSV处理[^2] | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值