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

Sega00

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

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

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

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

СПИСОК 1

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

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

Т.е. совпали:
3 строка: апельсин, банан, яблоко;
5 строка: дыня, апельсин, яблоко, арбуз;
6 строка: яблоко, апельсин, банан.
А остальные удалить, либо все совпадения перенести в другой лист.
 
Могу подсказать как реализовать на 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
Могу подсказать как реализовать на 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"))
 
Просто супер, C# еще даже лучше)). Очень благодарен Вам. Не думал, что кто-то поможет в этом вопросе.

А можно еще, чтобы слова (апельсин, яблоко) брались из переменной. Т.е. слово "апельсин" взялось из {переменная 3}, яблоко из {переменная 4} и выглядело бы как то так: if (str.Contains("переменная 3") && str.Contains("переменная 4"))
project.Variables["tmp"].Value; где tmp название переменной в проекте
 
Могу подсказать как реализовать на 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
Мне надо по списку проверить не одну переменную. Переменных будет штук 5. В каждой переменной будет свое слово.

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

Т.е. для успешного выполнения, надо чтобы одна из строк в списке содержала все слова, которые будут лежат в переменных.
 
Мне надо по списку проверить не одну переменную. Переменных будет штук 5. В каждой переменной будет свое слово.

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

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

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

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

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

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

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

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
В строке будет одна цифра, а остальные слова.
 
Neval, все прекрасно работает. Вы мне очень помогли. Спасибо)
 
Neval, а как подставить вместо цифр переменные

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

Вместо 30 (переменная 7); 53 (переменная 8)
 
а если у тебя +100500 разновидностей слов для сравнения ты чего будешь железную дорогу строить в if ?
или у тебя только апельсин и яблоко ?
 
  • Спасибо
Реакции: Dimionix
Слов
а если у тебя +100500 разновидностей слов для сравнения ты чего будешь железную дорогу строить в if ?
или у тебя только апельсин и яблоко ?

Слов в строке мало (5 шт.) и они не меняются, но самих строк до 100 штук. Мне нужен был быстрый поиск по строкам всего списка. Ищем те слова, которые задаются.
 
ты сейчас пытаешься вместо цифр заменить на переменую, в переменной у тебя строка, ты собираешься всю строку с числом сравнивать ?

ты опиши конкректно от а до я что надо
и покажи что в списке
что в переменой
а то начал со слов, закончил что там цифры есть, заменив цифры на переменые ты не решишь задачу этим снипетом и снова вопрос задаш, поэтому точно и достоверно опиши
яблоки с апельсинами нам точно не нужны ))))
 
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
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, Вы меня правильно поняли. Спасибо за помощь!
 

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