Удалить дубликаты записей в текстовом файле - PullRequest
2 голосов
/ 17 марта 2020

ниже - это исходный код, который извлекает данные из базы данных и сохраняет их внутри 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);
    }
  }
}

Ответы [ 5 ]

0 голосов
/ 17 марта 2020

Надеюсь, это поможет.

Вы можете сделать это, используя отличительный метод Linq.

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

0 голосов
/ 17 марта 2020

Давайте извлечем метод для отдельных значений:

   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());
0 голосов
/ 17 марта 2020

Вы можете прочитать всю строку в файле в список строк и добавить строку из БД, наконец, записав в файл разные данные:

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);
    }
}
0 голосов
/ 17 марта 2020

Кроме того, вы можете изменить порядок файлов с помощью 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
0 голосов
/ 17 марта 2020

Вы можете использовать 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);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...