Как получить имя блокнота из папки у которого больше всего слова из переменной?

  • Автор темы Автор темы The_vAe
  • Дата начала Дата начала

The_vAe

Client
Регистрация
30.05.2019
Сообщения
3 753
Реакции
1 491
Баллы
113
Всех с Новым Годом! :az:
У кого будет возможность, помогите, пожалуйста, сложить снипет для:
В папке лежат 50+ блокнотов с текстами. Мне нужно открыть каждый блокнот и посчитать в нем наличие количества определенного слова из переменной, после того, как узнаем количество определенного слова из переменной из каждого блокнота, нужно получить дорогу к файлу + имя файла.txt того блокнота, у которого данного определенного слова из переменной больше всего.
Есть код с форума, который помогает получить количество данного слова из переменной - в одном списке:
C#:
Развернуть Свернуть Копировать
var count=0;
var slovo= project.Variables["slovo"].Value; // Слово, по которому будем искать совпадения
var list= project.Lists["list"]; // Получаем список, в котором будем искать


// ищем в каждой строчке в списке
    for(int i=0; i < list.Count; i++) {
       var str = list[i]; // читаем строку из списка

        // проверяем содержание текста в строке, если есть совпадение возвращаем "yes"
        if (str.Contains(slovo)) {
           count++;
        }
   }

return count; // возвращаем количество строк в которых найдено совпадение

Но он понятное дело не подойдет, так как идет привязки к имени одного списка ( который должен быть заготовлен в зенке) , а нужно что бы код получил из Списка ( в котором лежат готовые дороги к нужным нам 50+ блокнотам например) блокноты и обработал их всех, выдав дорогу+имя блокнота с наибольшим количеством наличия слова.
 
C#:
Развернуть Свернуть Копировать
project.Variables["slovo"].Value = "рас";

var text = "рас два три четыре пять рас рас рас Один два три Рас".ToLower();

string[] words = text.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);

var result = words.GroupBy(x => x)
    .Where(x => x.Contains(project.Variables["slovo"].Value))
    .Select(x => new {Word = x.Key, Frequency = x.Count() });

    

foreach (var item in result) {
    project.SendInfoToLog(String.Format("Слово: {0}\tКоличество повторов: {1}", item.Word, item.Frequency),true);
}
 
  • Спасибо
Реакции: The_vAe
C#:
Развернуть Свернуть Копировать
project.Variables["slovo"].Value = "рас";

var text = "рас два три четыре пять рас рас рас Один два три Рас".ToLower();

string[] words = text.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);

var result = words.GroupBy(x => x)
    .Where(x => x.Contains(project.Variables["slovo"].Value))
    .Select(x => new {Word = x.Key, Frequency = x.Count() });



foreach (var item in result) {
    project.SendInfoToLog(String.Format("Слово: {0}\tКоличество повторов: {1}", item.Word, item.Frequency),true);
}
Не совсем понимаю как этот код можно применить в случае, когда есть 50 блокнотов, из которых нужно найти 1 блокнот с найбольшим количеством определенного слова и выдать его дорогу.
 
Делаешь первый цикл в котором перебираешь все пути, т.е. текстовые документы. Получаешь название документа и сохраняешь с названием кол-во повторов, сохраняешь результаты в какой-то список. Дальше следующим циклом перебираешь полученные результаты и для большего из них у тебя уже есть название документа.
 
  • Спасибо
Реакции: The_vAe
Делаешь первый цикл в котором перебираешь все пути, т.е. текстовые документы. Получаешь название документа и сохраняешь с названием кол-во повторов, сохраняешь результаты в какой-то список. Дальше следующим циклом перебираешь полученные результаты и для большего из них у тебя уже есть название документа.
Подскажите, пожалуйста, как тогда перебрать полученные результаты, что бы потом сравнить их по наибольшему числу?
 
Можешь добавлять результаты в словарь, потом просто отсортировать словарь по большему значению и получить значение словаря.

C#:
Развернуть Свернуть Копировать
Dictionary<string, int> dict = new Dictionary<string, int>();
 
  • Спасибо
Реакции: The_vAe
В папке лежат 50+ блокнотов с текстами. Мне нужно открыть каждый блокнот и посчитать в нем наличие количества определенного слова из переменной, после того, как узнаем количество определенного слова из переменной из каждого блокнота, нужно получить дорогу к файлу + имя файла.txt того блокнота, у которого данного определенного слова из переменной больше всего.
Возврат пути файла с максимальным количеством вхождений указанного слова:
Развернуть Свернуть Копировать
string[] files = {"file_1.txt","file_2.txt","file_3.txt","file_4.txt"}; // Имена файлов
List<string> list =files.Select(x=> Path.Combine(project.Directory, x)).ToList(); // Файлы лежат рядом с шаблоном
string word = "text"; // Каждый файл содержит какой-то текст - будем искать слово текст

string line = string.Empty; // В эту переменную вернём результат
int max = -1; // Переменная будет хранить максимальное значение
foreach(string path in list) { // Проходим по всем файлам
    int amount = new Regex(word).Matches(File.ReadAllText(path)).Count; // Считаем количество вхождений
    project.SendInfoToLog(string.Format(@"max: {0} > amount {1} {2}", max, amount, path )); // Посмотрим в логе, чтобы проверить
    if(amount > max) { // Если новое количество вхождений больше - изменяем максимум, обновляем новый путь
        line = path; // Фиксируем путь с максимальным значением
        max = amount; // Обновляем максимум
    }
}

// Где-то здесь у нас уже в переменной line результат и в переменной max - максимальное количество вхождений
// Выводим в лог
project.SendInfoToLog(string.Format(@"{0} Файл: {1} Путь: {2} Имя: {3} Имя без расширения: {4}", max, line, Path.GetDirectoryName(line), Path.GetFileName(line), Path.GetFileNameWithoutExtension(line)));

return line; // Возвращаем результат с кубика
1609456852177.png
 
  • Спасибо
Реакции: The_vAe
вариант с linq
C#:
Развернуть Свернуть Копировать
string word = "СЛОВО";
string pattern = @"(?i)\b" + word + @"\b";

var res = project.Lists["СПИСОК_В_КОТОРОМ_ПУТИ"]
    .Select(x => new { Path = x, Count = Regex.Matches(File.ReadAllText(x), pattern).Count })
    .OrderByDescending(x => x.Count)
    .First();

return res.Path;
 
  • Спасибо
Реакции: The_vAe
Возврат пути файла с максимальным количеством вхождений указанного слова:
Развернуть Свернуть Копировать
string[] files = {"file_1.txt","file_2.txt","file_3.txt","file_4.txt"}; // Имена файлов
List<string> list =files.Select(x=> Path.Combine(project.Directory, x)).ToList(); // Файлы лежат рядом с шаблоном
string word = "text"; // Каждый файл содержит какой-то текст - будем искать слово текст

string line = string.Empty; // В эту переменную вернём результат
int max = -1; // Переменная будет хранить максимальное значение
foreach(string path in list) { // Проходим по всем файлам
    int amount = new Regex(word).Matches(File.ReadAllText(path)).Count; // Считаем количество вхождений
    project.SendInfoToLog(string.Format(@"max: {0} > amount {1} {2}", max, amount, path )); // Посмотрим в логе, чтобы проверить
    if(amount > max) { // Если новое количество вхождений больше - изменяем максимум, обновляем новый путь
        line = path; // Фиксируем путь с максимальным значением
        max = amount; // Обновляем максимум
    }
}

// Где-то здесь у нас уже в переменной line результат и в переменной max - максимальное количество вхождений
// Выводим в лог
project.SendInfoToLog(string.Format(@"{0} Файл: {1} Путь: {2} Имя: {3} Имя без расширения: {4}", max, line, Path.GetDirectoryName(line), Path.GetFileName(line), Path.GetFileNameWithoutExtension(line)));

return line; // Возвращаем результат с кубика
Посмотреть вложение 70044
Спасибо, работает. А как верно указать имена файлов.txt, например со Списка(Блокнота), которые находятся каждый с новой строки?






вариант с linq
C#:
Развернуть Свернуть Копировать
string word = "СЛОВО";
string pattern = @"(?i)\b" + word + @"\b";

var res = project.Lists["СПИСОК_В_КОТОРОМ_ПУТИ"]
    .Select(x => new { Path = x, Count = Regex.Matches(File.ReadAllText(x), pattern).Count })
    .OrderByDescending(x => x.Count)
    .First();

return res.Path;
Не совсем понимаю как он работает, так как возвращаем только первую дорогу к файлу, независимо от количества слов.
 
Не совсем понимаю как он работает, так как возвращаем только первую дорогу к файлу, независимо от количества слов.
Не знаю, что сказать. У меня возвращает с наибольшим вхождением.
Кстати, в res.Count хранится количество вхождений
 
  • Спасибо
Реакции: The_vAe
Не знаю, что сказать. У меня возвращает с наибольшим вхождением.
Кстати, в res.Count хранится количество вхождений
Спасибо, позже чуть еще попробую поковырять и разобрать.
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)