//OK的话分全部给你,虽然不多
//有一个datatable里面存放,文件名称(FileName),日志信息(LogInfo),所在文件行号(InFileNum)
//eg:  
//     FileName     LogInfo      InFileNum
//     a.txt        log1            1
//     a.txt        log1            2 
//     b.txt        log2            1
//     c.txt        log3            10
//     c.txt        log3            11
//我想得到结果是
//     FileName     LogInfo      InFileNum
//     a.txt        log1            1 
//     b.txt        log2            1 
//     c.txt        log3            10
//也就是每一个日志出第一次出现的文件及所在文件内的行号现在已经用了 
//方法一:
 for (int i = 0; i < dv_All.Table.Rows.Count - 1; i++)
            {
                if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[i+ 1]["LogInfo"].ToString().Trim))
                { 
                    dv_All.Table.Rows[i].Delete();
                    dv_All.Table.AcceptChanges();
                    i--;
                }
            }
//         上面这种依然有重复数据
//方法二:
       DataTable dv_All = dv_All.Table.DefaultView.ToTable(true, new string[] { "FileName", "LogInfo", "InFileNum" }).DefaultView;
//       上面这种同第一种一样有重复数据           DataTable dv_All = dv_All.Table.DefaultView.ToTable(true, new string[] {"LogInfo"}).DefaultView;
//这个没有但是只能返回有日志信息(因为dataview的ToTable()方法第二个参数只能写一列字段才能去重,但是这样就不能满足我输出是的多列都有)

解决方案 »

  1.   

    select distinct user_id from dbo.cn_T_file  
    distinct 关键字取出重复
      

  2.   

    select * from Tb t
    where not exists(select 1 from Tb where FileName=t.FileName  and [InFileNum]>t.[InFileNum])select *
    from Tb t
    where [InFileNum] = (select min([InFileNum]) from Tb where FileName=t.FileName)
      

  3.   

    不好意思补充一下:我这里的数据不是从数据库读出来的,是直接从其他的日志.txt文件中过滤出来的,这里的dataView只是一个临时存储的地方,还要取重复之后再显示到其他地方的
      

  4.   

    foreach(string s in File.ReadAllLines("")){}判断重复数据
    list.Contains
      

  5.   

    重复数据 应该在SQL里面就直接处理!
      

  6.   

    循环判断一下不就可以了吗?看看是否存在该文件  foreach+contains方法;
      

  7.   

    方法一有问题要用两个for循环
    思路:
    第一个for游遍所有数据;
    第二个for用这个数据和后面的每一个数据比较,相同的删除
      

  8.   

    试试这个:
    for (int i = 0; i < dv_All.Table.Rows.Count - 1; i++)
    {
        for(int j=i+1;j < dv_All.Table.Rows.Count - 1;j++)
        {
            if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[j]["LogInfo"].ToString().Trim))
            { 
               dv_All.Table.Rows[j].Delete();
               dv_All.Table.AcceptChanges();                   
             }
        }
    }
      

  9.   

    有好几种个办法:
    1.最快最简单的,使用hashtable,代码略
    2.修改你原来的程序,从后向前查就行了:
     for (int i = dv_All.Table.Rows.Count - 1; i >0; i--)
                {
                    if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[i- 1]["LogInfo"].ToString().Trim))
                    { 
                        dv_All.Table.Rows[i].Delete();                }
                }
      

  10.   

    datatable本身有个筛选方法。
    datatable.select(" group by FileName,LogInfo,InFileNum")
      

  11.   


    zshdy 不好意思啊,能不能把hashTable方法写一下,因为我也要考虑性能问题,数据量有点儿,一次要过滤十个8M左右的txt文件,所以....谢谢了
      

  12.   

    luokuijun520
    我的那条纪录是重复的??本来就是有一些字段里面的值是重复得,所以才来问怎么把重复字段的记录给干掉
      

  13.   

    定义一个新的DataTable,添加相同的列,然后定义一个ArrayList。
    for之前的DataTable,判断LogInfo字段的值是否在ArrayList中,如果不在,则向ArrayList添加LogInfo字段的值,同时把该行的值添加到新的DataTable中,那么新的DataTable就是你要的结果。
      

  14.   

    cschenlin
    麻烦您能不能写一下具体,现在半天没弄出结果来,脑子都成空白了。而且我还要考虑性能问题,数据量也有点大。谢啦
      

  15.   

    dt0是你读取txt得到的DataTable;
    dt1是新定义的DataTable;ArrayList arrList = new ArrayList();
    for(int i=0;i<dt0.Rows.Count;i++)
    {
        if(!arrList.Contains(dt0.Rows[i]["LogInfo"].toString()))
        {
            arrList.Add(dt0.Rows[i]["LogInfo"].toString());
            DataRow dr = dt1.NewRow();
            dr["FileName"] = dt0.Rows[i]["FileName"];
            dr["LogInfo"] = dt0.Rows[i]["LogInfo"];
            dr["InFileNum"] = dt0.Rows[i]["InFileNum"];
            dt1.Rows.Add(dr);
        }
    }dt1就是你要的结果。
      

  16.   

    我觉得第一种方法就可以 用Remove()试试
     
    for (int i = 0; i < dv_All.Table.Rows.Count - 1; i++)
                {
                    if (dv_All.Table.Rows[i]["LogInfo"].ToString().Trim() == dv_All.Table.Rows[i+ 1]["LogInfo"].ToString().Trim))
                    { 
                        dv_All.Table.Rows[i].Delete();  //改成 dv_All.Table.Rows.RemoveAt(i);      
                        dv_All.Table.AcceptChanges();
                        i--;
                    }
                }
      

  17.   

    public class File_info
        {
            //这里为了简便就不用属性了啊
            public string FileName;
            public string LogoInfo;
            public string InfileNum;
        }       DataTable dt = new DataTable();
            List<File_info> list = new List<File_info>();        foreach(DataRow row in dt.Rows)
            {
                //初始化实体
                File_info f = new File_info();
                f.FileName = row["FileInfo"].ToString();
                f.LogoInfo = row["LogoInfo"].ToString();
                f.InfileNum = row["InfileNum"].ToString();            if (!list.Contains(f))
                {
                    list.Add(f);
                }
            }楼主,代码我没有运行过,意思大概就是这样了,最后你要的数据就在ArrayList中
      

  18.   

    public class File_info
        {
            //这里为了简便就不用属性了啊
            public string FileName;
            public string LogoInfo;
            public string InfileNum;
        }       DataTable dt = new DataTable();
            List<File_info> list = new List<File_info>();        foreach(DataRow row in dt.Rows)
            {
                //初始化实体
                File_info f = new File_info();
                f.FileName = row["FileInfo"].ToString();
                f.LogoInfo = row["LogoInfo"].ToString();
                f.InfileNum = row["InfileNum"].ToString();            if (!list.Contains(f))
                {
                    list.Add(f);
                }
            }楼主,代码我没有运行过,意思大概就是这样了,最后你要的数据就在List中
      

  19.   


    差不多根我想的一样,不过放进Table是时候这样做不就不用删除重复的了吗?
      

  20.   

    谢谢cschenlin,hc312117511我来试一下看,我自己刚才有写了一种方法但是性能还稍微差点,平均一个8M的txt文件在10W行数据左右,一次大概要处理十个这样的文件,所以得考虑性能问题
      

  21.   


    方法1:
     for (int i = 0; i < dt.Rows.Count; i++)
                {
                    for (int j = i + 1; j < dt.Rows.Count; j++)
                    {
                        if (dt.Rows[i]["UnNum"].ToString().Trim() == dt.Rows[j]["UnNum"].ToString().Trim())
                        {
                            dt.Rows.RemoveAt(j);   RemoveAt与Delete
                            //dt.Rows[i].Delete();
                            //dt.AcceptChanges();
                        }
                    }
                }
     RemoveAt与Delete比较得出delete效率低而且重复数据还有很多,RemoveAt相对性能高方法2:            
                //ArrayList arrList = new ArrayList();
                //for (int i = 0; i < dt.Rows.Count; i++)
                //{
                //    if (!arrList.Contains(dt.Rows[i]["UnNum"].ToString()))
                //    {
                //        arrList.Add(dt.Rows[i]["UnNum"].ToString());
                //        DataRow dr = dt.NewRow();
                //        dr["FileName"] = dt.Rows[i]["FileName"];
                //        dr["UnNum"] = dt.Rows[i]["UnNum"];
                //        dr["InFileNum"] = dt.Rows[i]["InFileNum"];
                //        dt.Rows.Add(dr);
                //    }
                //}
    方法2数据重复还有,性能相对低一些
    最后重点感谢fcdesk,cschenlin,hc312117511
      

  22.   

    如何取出DataTable中某几个字段(列名)组合新表
    在偶不知道第二种方法之前.偶费了好大劲才把这个问题解决.下面把这两个方法都帖出来,请大家批评指正.或有更好的办法也帖出来,一起交流第一种方法:            string sql = "Report_proc";
                SqlParameter[] paras ={ new SqlParameter("@deptno", "") };
                DataTable dt = Utils.SQLHelper.ExecuteProForDataTable(sql, paras);
                DataTable dtc = new DataTable(); //新new的一个表,用来存放我们想要的字段(列)            for (int i = 0; i < dt.Columns.Count; i++)
                {
                    if (dt.Columns.ColumnName.IndexOf("renshu") == 0)
                    {
                        DataColumn dc = new DataColumn(dt.Columns.ColumnName, typeof(string));
                        dtc.Columns.Add(dc);
                    }
                }
                for (int j = 0; j < dt.Rows.Count; j++)
                {
                    DataRow row = dtc.NewRow();
                    int m = 0;
                    for (int l = 0; l < dt.Columns.Count; l++)
                    {                    if (dt.Columns[l].ColumnName.IndexOf("renshu") == 0) //我要指取的字段都有一个特征里面都含有renshu这个串
                        {
                            if (m < 5) //限制下限,以免超出列的总数,防止出现异常
                            {
                                row[m] = (dt.Rows[j][l].ToString() == "" ? 0 : Convert.ToInt32(dt.Rows[j][l].ToString()));
                                m = m + 1;
                            }
                        }                }
                    dtc.Rows.Add(row);//增加一行
                }
    第二种方法:DataTable newTable = MyDataTable.DefaultView.ToTable(false, new string[] { "ColumnName1", "ColumnName1", "ColumnName1" });
    这里我们使用的ToTable方法,相比第一种方法而言,好处大家一看就知道了
      

  23.   


    这个是办不到的!因为每次都是New了一个对象。而这个对象是引用类型,所以。就算属性值全部一样,判断都是不重复的。起不到判断的作用。
    结果还是会重复滴……