Сравнение текста.

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
Здравствуйте!

Подскажите, как можно реализовать следующее действие.

Предположим, у нас есть текст в переменной: {переменная 1}: апельсин, яблоко

Нужно сравнить со списком построчно (строк будет около 100 штук):

СПИСОК 1

1 строка: апельсин, банан, ананас
2 строка: ананас, яблоко, арбуз, апельсин
3 строка: апельсин, банан, яблоко
4 строка: арбуз, ананас, дыня
5 строка: дыня, апельсин, яблоко, арбуз
6 строка: яблоко, апельсин, банан

И выбрать только те строки, в которых присутствуют все данные ({переменная 1}: апельсин, яблоко) не важно в каком порядке, главное что они есть .

Т.е. совпали:
3 строка: апельсин, банан, яблоко;
5 строка: дыня, апельсин, яблоко, арбуз;
6 строка: яблоко, апельсин, банан.
А остальные удалить, либо все совпадения перенести в другой лист.
 

Neval

Client
Регистрация
22.07.2015
Сообщения
24
Благодарностей
54
Баллы
13
Могу подсказать как реализовать на C#

В цикле проходим по списку построчно и выбираем те в которых присутствуют все данные и записываем во 2-й список
Код:
string str = string.Empty;

for ( int i = 0; i < project.Lists["СПИСОК 1"].Count; i++)
{
    str = project.Lists["СПИСОК 1"][i];
    if (str.Contains("апельсин") && str.Contains("яблоко")){
           project.Lists["СПИСОК 2"].Add(str);
    }
}
 
  • Спасибо
Реакции: vadim4ukr и Sega00

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
Могу подсказать как реализовать на C#

В цикле проходим по списку построчно и выбираем те в которых присутствуют все данные и записываем во 2-й список
Код:
string str = string.Empty;

for ( int i = 0; i < project.Lists["СПИСОК 1"].Count; i++)
{
    str = project.Lists["СПИСОК 1"][i];
    if (str.Contains("апельсин") && str.Contains("яблоко")){
           project.Lists["СПИСОК 2"].Add(str);
    }
}
Просто супер, C# еще даже лучше)). Очень благодарен Вам. Не думал, что кто-то поможет в этом вопросе.

А можно еще, чтобы слова (апельсин, яблоко) брались из переменной. Т.е. слово "апельсин" взялось из {переменная 3}, яблоко из {переменная 4} и выглядело бы как то так: if (str.Contains("переменная 3") && str.Contains("переменная 4"))
 

etyipin

Client
Регистрация
15.12.2017
Сообщения
95
Благодарностей
35
Баллы
18
Просто супер, C# еще даже лучше)). Очень благодарен Вам. Не думал, что кто-то поможет в этом вопросе.

А можно еще, чтобы слова (апельсин, яблоко) брались из переменной. Т.е. слово "апельсин" взялось из {переменная 3}, яблоко из {переменная 4} и выглядело бы как то так: if (str.Contains("переменная 3") && str.Contains("переменная 4"))
project.Variables["tmp"].Value; где tmp название переменной в проекте
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113
Могу подсказать как реализовать на C#

В цикле проходим по списку построчно и выбираем те в которых присутствуют все данные и записываем во 2-й список
Код:
string str = string.Empty;

for ( int i = 0; i < project.Lists["СПИСОК 1"].Count; i++)
{
    str = project.Lists["СПИСОК 1"][i];
    if (str.Contains("апельсин") && str.Contains("яблоко")){
           project.Lists["СПИСОК 2"].Add(str);
    }
}
если будет апельсины то снипет бесполезный, если точные совпадения ищите никогда не используйте contains
 
  • Спасибо
Реакции: Neval

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
Мне надо по списку проверить не одну переменную. Переменных будет штук 5. В каждой переменной будет свое слово.

Пример:
if (str.Contains("переменная 3") && str.Contains("переменная 4") && str.Contains("переменная 5") && str.Contains("переменная 6")&& str.Contains("переменная 7")).

Т.е. для успешного выполнения, надо чтобы одна из строк в списке содержала все слова, которые будут лежат в переменных.
 

Neval

Client
Регистрация
22.07.2015
Сообщения
24
Благодарностей
54
Баллы
13
Мне надо по списку проверить не одну переменную. Переменных будет штук 5. В каждой переменной будет свое слово.

Пример:
if (str.Contains("переменная 3") && str.Contains("переменная 4") && str.Contains("переменная 5") && str.Contains("переменная 6")&& str.Contains("переменная 7")).

Т.е. для успешного выполнения, надо чтобы одна из строк в списке содержала все слова, которые будут лежат в переменных.
Так и будет работать, просто, как правильно сказали, если нам нужны именно точные совпадения слов, то может непрокатить.
Например мы ищём слово апельсин, а строка содержит слова - апельсиновый джем, то она запишется во 2-й список т.к. в слово апельсиновый входит апельсин
 
  • Спасибо
Реакции: Sega00

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
В списке будут такие же слова как и в переменных. Если в списке апельсиновый джем, то и в переменной тоже апельсиновый джем.

Еще если возможно.
Как можно сделать, если в списке есть кроме слов цифры. Т.е. в списке:

1 строка: апельсин, 51, банан.
2 строка: апельсин, 55, банан

Мне нужно найти: апельсин и проверить наличие цифры в диапазоне от 30 до 53. Результат: 1 строка : апельсин, 51, банан. (51 входит в этот диапазон, значит все хорошо).
 

Neval

Client
Регистрация
22.07.2015
Сообщения
24
Благодарностей
54
Баллы
13
В списке будут такие же слова как и в переменных. Если в списке апельсиновый джем, то и в переменной тоже апельсиновый джем.

Еще если возможно.
Как можно сделать, если в списке есть кроме слов цифры. Т.е. в списке:

1 строка: апельсин, 51, банан.
2 строка: апельсин, 55, банан

Мне нужно найти: апельсин и проверить наличие цифры в диапазоне от 30 до 53. Результат: 1 строка : апельсин, 51, банан. (51 входит в этот диапазон, значит все хорошо).
тогда Contains подойдёт.
С цифрами будет нужна регулярка. Там будет одна цифра или несколько?
если одна, то вот подойдёт
Код:
string str, number = string.Empty;

Regex rgxNumber = new Regex(@"[0-9]{2}");
for ( int i = 0; i < project.Lists["Sp1"].Count; i++)
{
    str = project.Lists["Sp1"][i];
    number = rgxNumber.Match(str).ToString();
    if (number!="" && str.Contains("апельсин") && str.Contains("яблоко") && int.Parse(number)>30 && int.Parse(number)<53){
           project.Lists["Sp2"].Add(str);
    }
}
 
  • Спасибо
Реакции: Sega00

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
В строке будет одна цифра, а остальные слова.
 

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
Neval, все прекрасно работает. Вы мне очень помогли. Спасибо)
 

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
Neval, а как подставить вместо цифр переменные

if (number!="" && str.Contains("апельсин") && str.Contains("яблоко") && int.Parse(number)>30 && int.Parse(number)<53){

Вместо 30 (переменная 7); 53 (переменная 8-)
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113
а если у тебя +100500 разновидностей слов для сравнения ты чего будешь железную дорогу строить в if ?
или у тебя только апельсин и яблоко ?
 
  • Спасибо
Реакции: Dimionix

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
Слов
а если у тебя +100500 разновидностей слов для сравнения ты чего будешь железную дорогу строить в if ?
или у тебя только апельсин и яблоко ?
Слов в строке мало (5 шт.) и они не меняются, но самих строк до 100 штук. Мне нужен был быстрый поиск по строкам всего списка. Ищем те слова, которые задаются.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 375
Благодарностей
2 040
Баллы
113
ты сейчас пытаешься вместо цифр заменить на переменую, в переменной у тебя строка, ты собираешься всю строку с числом сравнивать ?

ты опиши конкректно от а до я что надо
и покажи что в списке
что в переменой
а то начал со слов, закончил что там цифры есть, заменив цифры на переменые ты не решишь задачу этим снипетом и снова вопрос задаш, поэтому точно и достоверно опиши
яблоки с апельсинами нам точно не нужны ))))
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113
C#:
IZennoList sourceList = project.Lists["SourceList"]; // исходный список
IZennoList destList = project.Lists["DestList"]; // список, в который класть результат
string[] words = project.Variables["words"].Value.Split('|'); // переменная со словами в формате "слово1|слово2|словоN" (напр., апельсин|яблоко|хрен)
int[] nums = project.Variables["nums"].Value.Split('|').Select(int.Parse).ToArray(); // переменная с числами диапазона в формате "min|max" (напр., 30|53)

lock (SyncObjects.ListSyncer) {
    foreach (string str in sourceList) {
        int num = int.Parse(Regex.Match(str, @"\d+").Value);
        if (words.All(s => str.Contains(s)) && num >= nums[0] && num <= nums[1])
            destList.Add(str);
    }
}
 
  • Спасибо
Реакции: Igorii, Sega00 и ssXXXss

Sega00

Client
Регистрация
29.03.2017
Сообщения
40
Благодарностей
4
Баллы
8
C#:
IZennoList sourceList = project.Lists["SourceList"]; // исходный список
IZennoList destList = project.Lists["DestList"]; // список, в который класть результат
string[] words = project.Variables["words"].Value.Split('|'); // переменная со словами в формате "слово1|слово2|словоN" (напр., апельсин|яблоко|хрен)
int[] nums = project.Variables["nums"].Value.Split('|').Select(int.Parse).ToArray(); // переменная с числами диапазона в формате "min|max" (напр., 30|53)

lock (SyncObjects.ListSyncer) {
    foreach (string str in sourceList) {
        int num = int.Parse(Regex.Match(str, @"\d+").Value);
        if (words.All(s => str.Contains(s)) && num >= nums[0] && num <= nums[1])
            destList.Add(str);
    }
}
Dimionix, Вы меня правильно поняли. Спасибо за помощь!
 

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