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

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
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+ блокнотам например) блокноты и обработал их всех, выдав дорогу+имя блокнота с наибольшим количеством наличия слова.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
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);
}
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
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 блокнот с найбольшим количеством определенного слова и выдать его дорогу.
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Делаешь первый цикл в котором перебираешь все пути, т.е. текстовые документы. Получаешь название документа и сохраняешь с названием кол-во повторов, сохраняешь результаты в какой-то список. Дальше следующим циклом перебираешь полученные результаты и для большего из них у тебя уже есть название документа.
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Делаешь первый цикл в котором перебираешь все пути, т.е. текстовые документы. Получаешь название документа и сохраняешь с названием кол-во повторов, сохраняешь результаты в какой-то список. Дальше следующим циклом перебираешь полученные результаты и для большего из них у тебя уже есть название документа.
Подскажите, пожалуйста, как тогда перебрать полученные результаты, что бы потом сравнить их по наибольшему числу?
 

RoyalBank

Client
Регистрация
07.09.2015
Сообщения
557
Благодарностей
550
Баллы
93
Можешь добавлять результаты в словарь, потом просто отсортировать словарь по большему значению и получить значение словаря.

C#:
Dictionary<string, int> dict = new Dictionary<string, int>();
 
  • Спасибо
Реакции: Gunjubasik

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 788
Благодарностей
2 453
Баллы
113
В папке лежат 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
 
  • Спасибо
Реакции: Gunjubasik

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
вариант с 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;
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Возврат пути файла с максимальным количеством вхождений указанного слова:
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;
Не совсем понимаю как он работает, так как возвращаем только первую дорогу к файлу, независимо от количества слов.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Не совсем понимаю как он работает, так как возвращаем только первую дорогу к файлу, независимо от количества слов.
Не знаю, что сказать. У меня возвращает с наибольшим вхождением.
Кстати, в res.Count хранится количество вхождений
 
  • Спасибо
Реакции: Gunjubasik

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Не знаю, что сказать. У меня возвращает с наибольшим вхождением.
Кстати, в res.Count хранится количество вхождений
Спасибо, позже чуть еще попробую поковырять и разобрать.
 

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