Попытка сосчитать и перечислить имена в текстовом файле - PullRequest
0 голосов
/ 16 июня 2019

У меня возникли некоторые проблемы со следующим: у меня есть текстовый файл с примерно двумя тысячами имен, с кучей повторяющихся записей.Я пытаюсь создать что-то, где будет отображаться количество раз, когда появляется имя.Так, например: Джон Доу |48 раз Джейн Доу |20 раз и т.д.

Ответы [ 4 ]

1 голос
/ 16 июня 2019

Данные вводятся в файл names.txt.

Джон Део Джон Део Джон Део Джон фитиль Джон фитиль тестирование Тестирование

Я сделал файл в проекте names.txt и прочитал его в коде ниже.

string[] lines = File.ReadAllLines("../../names.txt"); 

Затем сгруппировать имена и распечатать в консольном приложении.

var mylines = lines.GroupBy(g => g).Select(s => new { Name = s, Count = s.Count() });
            foreach (var line in mylines)
            {
                Console.WriteLine($"{line.Name.Key} | {line.Count}");
            }  

Результат #

Джон Део | 11 Джон фитиль | 2 Тестирование 5

0 голосов
/ 16 июня 2019

Вы можете перебрать результаты вашего запроса и добавить каждое имя / число в StringBuilder, а затем вывести окончательную строку в RichTextBox:

StringBuilder sb = new StringBuilder();
foreach(var KVP in yourDictionaryVariableName)
{
    sb.AppendLine(KVP.Key + " | " + KVP.Value.ToString());
}
richTextBox1.Text = sb.ToString();
0 голосов
/ 16 июня 2019

Предположение:

Допустим, у нас уже есть каждая строка текстового файла в объекте List<string>, который мы назовем names, и что каждая строка в текстовом файле представляет собой целое имя, написанное правильно.

Группировка / печать данных:

Используя LINQ, мы можем сгруппировать эти значения самостоятельно (аналогично SQL) и затем преобразовать результаты IGrouping в объекты, которые мы хотим использовать позже в нашем приложении.,Например:

var totals = names.GroupBy(x => x)
    .Select(group => new { Name = group.Key, Count = group.Count() });

foreach ( var total in totals )
{
    Console.WriteLine($"{total.Name} | {total.Count} times");
}

Другой вариант - использовать существующий код и просто распечатать значения словаря

var totals = names
    .Select(s => new { Key = s.Key, Count = s.Count()})
    .ToDictionary(d => d.Key, d => d.Count);

foreach ( var kvp in totals )
{
    Console.WriteLine($"{kvp.Key} | {kvp.Value} times");
}

Сохранение / отображение данных:

Если вы хотите сделать что-то другое, то печатать на консоль, вы можете просто манипулировать данными в нужное вам значение.Например, если вы хотите сохранить его в другом файле:

var csvContent = totals
    .Select(total => $"{total.Name},${total.Count} times")
    .ToArray();

File.WriteAllLines(filePath, csvContent);

Или вы можете создать строку (например, выше: String.Join("\n", csvContent)) и обновить RichTextBox примерно так:

0 голосов
/ 16 июня 2019

Есть много разных способов сделать это.Если все, что вам нужно, это определить количество и то, как оно отображается, не имеет значения, тогда вы можете вывести значения в файл CSV и просмотреть его в Excel.Я не знаю точно, как ваши имена отформатированы в простом примере ниже, я предполагаю одно имя на строку.

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using (var reader = new StreamReader("names.txt"))
            {
                var names = GetNames(reader).ToLookup(k => k);

                using (var writer = new StreamWriter("names.counted.csv"))
                {
                    foreach (var name in names)
                    {
                        writer.WriteLine($"{name.Key},{name.Count()}");
                    }
                }
            }

        }
        catch (Exception ex)
        {
            Console.Error.WriteLine(ex.ToString());
        }
    }

    static IEnumerable<string> GetNames(TextReader reader)
    {
        string line;
        while ((line = reader.ReadLine()) != null)
            yield return line;
    }
}
...