Нужно удалить одно из другого разом

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
Ку, не знаю куда запостить, думаю снипы самое то под такой вопрос.
Подскажите, как разом удалить из CSV файла, где куча данных, строки, которые содержатся в другом текстовом файле?

То есть, есть 2 файла
1. base.csv где вся информация находится в таком состоянии
C#:
"ne-slivaetsya.ru";"";"22.06.2021";"Английский";"";"";"30";"0";"0";"1";"1";"0";"0";"55";"45";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
"electroabc.ru";"";"06.07.2021";"Английский";"";"";"20";"1";"0";"6";"3";"0";"0";"18";"25";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
"technoptz.ru";"";"16.06.2021";"Русский";"10";"";"0";"0";"0";"2";"4";"0";"0";"0";"8";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
"evakuator24-khv.ru";"";"04.06.2021";"Русский";"";"";"0";"0";"0";"1";"1";"0";"0";"0";"1";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
"are-you-ready.ru";"";"02.04.2021";"Русский";"";"";"0";"0";"0";"1";"7";"0";"0";"36";"0";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
"cartexpress.ru";"";"17.08.2021";"Английский";"";"";"0";"0";"0";"3";"5";"0";"0";"2";"3";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
"zakon71.ru";"";"14.04.2021";"Русский";"";"";"10";"0";"0";"2";"5";"0";"0";"21";"1";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
"autozzvuk.ru";"";"30.04.2021";"Русский";"";"";"0";"0";"0";"2";"8";"0";"0";"175";"12";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
2. done.txt, где вся инфа это просто список
C#:
ne-slivaetsya.ru
electroabc.ru
technoptz.ru
evakuator24-khv.ru
are-you-ready.ru
cartexpress.ru
zakon71.ru
И надо сделать так чтобы из файла 1 удалились все строки, который содержит файл 2

В итоге мы должны получить такой результат
C#:
"autozzvuk.ru";"";"30.04.2021";"Русский";"";"";"0";"0";"0";"2";"8";"0";"0";"175";"12";"";"";"";"";"";"";"";"";"";"";"";"0";"0";"";"";"";"";"";""
Как это можно реализовать за одно действие?
Я могу это реализовать в цикле через кубики и списки, но это не кошерно

спасибо
 

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 115
Баллы
113
Нужен именно C#?
Обычным кубиком можно за 1 раз удалить.
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

Sergodjan

Administrator
Команда форума
Регистрация
05.09.2012
Сообщения
20 407
Благодарностей
9 115
Баллы
113

Вложения

  • Спасибо
Реакции: Sanekk, backoff и volody00

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
на c# сделал так (но выше пример классный, надо бы подтянуть регулярки). P.S. csv файл должен быть в формате utf-8 и результат нормально просматривается только в Notepad++ (а через excel некорректно смотрится)
C#:
List<string> done = new List<string>();
done.AddRange(File.ReadAllLines(project.Directory + @"\done.txt").ToList());

List<string> baseFile = new List<string>();
baseFile.AddRange(File.ReadAllLines(project.Directory + @"\base.csv", Encoding.UTF8).ToList());

for(int i=0;i<baseFile.Count;i++)
{
    for(int j=0;j<done.Count;j++)
    {
        if(baseFile[i].Contains(done[j]))
        {
            baseFile.RemoveAt(i);
            i--;
            break;
        }
    }
}

File.WriteAllLines(project.Directory + @"\base.csv", baseFile);
 
  • Спасибо
Реакции: Sergodjan и backoff

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
очень интересное решение, как-то даже не смотрел в эту сторону.
но есть одно НО, как обычно :-)

а что если доменов будет не 10, а 1кк+, интересно как будет вести себя в этот момент
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
на c# сделал так (но выше пример классный, надо бы подтянуть регулярки). P.S. csv файл должен быть в формате utf-8 и результат нормально просматривается только в Notepad++ (а через excel некорректно смотрится)
C#:
List<string> done = new List<string>();
done.AddRange(File.ReadAllLines(project.Directory + @"\done.txt").ToList());

List<string> baseFile = new List<string>();
baseFile.AddRange(File.ReadAllLines(project.Directory + @"\base.csv", Encoding.UTF8).ToList());

for(int i=0;i<baseFile.Count;i++)
{
    for(int j=0;j<done.Count;j++)
    {
        if(baseFile[i].Contains(done[j]))
        {
            baseFile.RemoveAt(i);
            i--;
            break;
        }
    }
}

File.WriteAllLines(project.Directory + @"\base.csv", baseFile);
четенько! все работает вроде как
 

ilyalidam

Client
Регистрация
17.10.2020
Сообщения
6
Благодарностей
2
Баллы
3
Вот хорошо отрабатывает на больших списках + не удаляет дубли
C#:
var bad = project.Lists["unsubscribe"].ToList();//стопслова
var mix = project.Lists["emails"].ToList();//потенциальные счастливцы
bad.Sort();
List <string> good = new List<string>();
foreach (var item in mix) {
    int l = 0, r = bad.Count();
    while (l + 1 < r) {
        int d = (l + r) / 2;
        if (string.Compare(bad[d], item) <= 0) l = d; else r = d;
    }
    if (bad[l] == item) continue;
    good.Add(item);
}
var eer = project.Lists["emails"];
eer.Clear();
eer.AddRange(good);
 

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