【问题标题】:Remove duplicate records on textfile删除文本文件中的重复记录
【发布时间】:2020-06-28 05:14:51
【问题描述】:

以下是检索数据库数据并存储在 DataTable 中并将写入文本文件的源代码。因此,我设法将记录保存在文本文件中,但存在重复数据,如下所示。

loggo2.txt

122222 08-0943-03 123333 08-0943-03 122222 08-0943-03 123333 08-0943-03 122222 08-0943-03 123333 08-0943-03 122222 08-0943-03 123333 08-0943-03 122222 08-0943-03 123333 08-0943-03

而我想要的是这个输出:

122222 08-0943-03 123333 08-0943-03

但是,我想在写入文本文件之前删除重复项,以便下次我可以在没有任何重复项的情况下存储在数据库中,请帮助

foreach (DataRow row1 in dt.Rows)
{
  if (row["Material"].ToString().ToLower().Contains(row1["Material"].ToString().ToLower()))
  {
    //// if match, then write the result
    string filename1 = "loggo2.txt";
    filename1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename1);
    using (StreamWriter w = File.AppendText(filename1))
    {
        var line = String.Format("{0} {1}", row1["Component"], row1["Material"]);
        w.WriteLine(line);
    }
  }
}

【问题讨论】:

标签: c# duplicates


【解决方案1】:

或者,您可以通过 linq 重新排列文件。

string path = @"C:\sampleText.txt";
string[] allText = File.ReadAllLines(path, Encoding.UTF8).Where(c => c != null && c != "").Select(item => item + Environment.NewLine).Distinct().ToArray();

File.WriteAllLines(path, allText);

输入:

122222 08-0943-03
123333 08-0943-03
122222 08-0943-03
123333 08-0943-03
122222 08-0943-03
123333 08-0943-03
122222 08-0943-03
123333 08-0943-03
122222 08-0943-03
123333 08-0943-03

输出:

122222 08-0943-03

123333 08-0943-03

【讨论】:

    【解决方案2】:

    您可以使用 LINQ 对这样的数据进行分组

    using System.Linq;
    .....
    
    foreach (var row1 in dt.Rows.OfType<DataRow>().GroupBy(r => new { Component = r["Component"], Material = r["Material"] }).Select(r => r.Key))
    {
      if (row["Material"].ToString().ToLower().Contains(row1.Material.ToString().ToLower()))
      {
        //// if match, then write the result
        string filename1 = "loggo2.txt";
        filename1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename1);
        using (StreamWriter w = File.AppendText(filename1))
        {
            var line = String.Format("{0} {1}", row1.Component, row1.Material);
            w.WriteLine(line);
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

      您可以将文件中的所有行读入字符串列表 并从数据库中添加字符串,最终将不同的内容写入文件,如下所示:

      var strList = new List<string>();
      string filename1 = "loggo2.txt";
          filename1 = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filename1);
      
      using (StreamReader reader = new StreamReader(filename1))
      {
          while(!reader.EndOfStream)
          {
              strList.Add(reader.ReadLine());
          }
      }
      
      foreach (DataRow row1 in dt.Rows)
      {
        if (row["Material"].ToString().ToLower().Contains(row1["Material"].ToString().ToLower()))
        {
          //// if match, then write the result
          strList.Add(String.Format("{0} {1}", row1["Component"], row1["Material"]));
        }
      }
      
      using (StreamWriter w = new StreamWriter(filename1, false))
      {
          foreach(var line in strList.Distinct().ToList())
          {
              w.WriteLine(line);
          }
      }
      

      【讨论】:

        【解决方案4】:

        我希望这能有所帮助。

        你可以通过使用 Linq 的 Distinct 方法来做到这一点。

        public static void Distinct_data()
            {
                string[] my= File.ReadAllLines(@"C:\Users\HP\source\repos\Display_turn_off\Display_turn_off\my_.txt");
                var gh= my.Distinct();
                foreach(string hj in gh)
                {
                    Console.WriteLine(hj);
                }
            }
        
        

        【讨论】:

          【解决方案5】:

          让我们为不同的值提取一个方法

             private IEnumerable<DataRow> MyDistinctRows() {
               HashSet<string> materials = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
          
               foreach (DataRow row in dt.Rows) 
                 if (materials.Add(row["Material"].ToString()))  
                   yield return row;
             }
          

          现在,我们可以将这些不同的文件保存到文件中

             File.AppendAllLines(filename1, MyDistinctRows()
               .Select(row => $"{row["Component"]} {row["Material"]}"));
          

          编辑:同样的想法,如果你想删除 文件中的重复项

             private IEnumerable<DataRow> MyDistinctRows() {
               HashSet<string> materials = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
          
               foreach (string line File.ReadLines(@"loggo2.txt")) 
                 if (materials.Add(line.Split(' ')[0])  
                   yield return line;
             }
          

          然后再次保存:

             // ToList() - materialize if you want to save into the same (loggo2.txt) file  
             File.AppendAllLines(filename1, MyDistinctRows()
               .Select(row => $"{row["Component"]} {row["Material"]}")
               .ToList());
          

          【讨论】:

            猜你喜欢
            • 2012-01-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多