регулярное выражение занимает более 1000 минут, чтобы завершить - PullRequest
0 голосов
/ 15 декабря 2018

Код ниже читает список слов из файла с именем WORDS, затем использует эти слова и ищет их в файле с именем CONTENT, затем удаляет эти слова из CONTENT и заменяет их на ###### и создаетновый файл с именем FINAL - файл слов содержит около 16 тыс. строк слов, файл CONTENT - около 16 тыс. строк и около 8 млн. слов - в общем, когда я его запустил, для его завершения потребовалось более 1000 минут, и я в конце концов сдался.

Есть ли способ ускорить этот процесс или использовать что-то значительно более эффективное?слова в словах начинаются с \ b и заканчиваются \ b - код работает, как я тестировал на файле CONTENT меньшего размера

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Text.RegularExpressions;


namespace ConsoleApp10
{
    class Program
    {
        static void Main(string[] args)
        {
            string SAR_CONTACTS = @"C:\Users\root\Desktop\WORDS.csv";
            string SAR_CONTENT = @"C:\Users\root\Desktop\CONTENT.csv";
            string READ_SAR_CONTACTS;
            using (StreamReader streamReader = new StreamReader(SAR_CONTENT, Encoding.UTF8))
            READ_SAR_CONTACTS = streamReader.ReadToEnd();

            string SAR_CONTACTS_FILE = File.ReadAllText(SAR_CONTACTS);
            string SAR_CONTENT_FILE = SAR_CONTACTS_FILE.Replace("\r\n", "|");
            SAR_CONTENT_FILE = SAR_CONTENT_FILE.Remove(SAR_CONTENT_FILE.Length - 1);
            string SAR_CONTENT_CENSORED = Regex.Replace(READ_SAR_CONTACTS, SAR_CONTENT_FILE, "######", RegexOptions.IgnoreCase);
            File.WriteAllText(@"C:\Users\root\Desktop\FINAL.csv", SAR_CONTENT_CENSORED);
        }
    }
}

1 Ответ

0 голосов
/ 15 декабря 2018

В общем, я бы просто выбросил Regex из окна для этого, так как он может довольно быстро усложниться для такого обширного файла.Используя ваш файл контактов вместо \b, я бы, вероятно, заменил его набором разделителей, таким как £&% (он прервется, если в этом порядке есть контакты с буквально одинаковой строкой разделителей).

Вот как я бы это написал - обратите внимание, что с точки зрения эффективности, это может быть не самым эффективным, но это будет работать.Также обратите внимание, что я добавил VB-версию Replace, чтобы регистр игнорировался, поскольку версия C # не имеет этой перегрузки (вместо этого вы могли бы написать функцию расширения).

using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace ConsoleApp5
{
    class Program
    {
        static void Main(string[] args)
        {
            string contacts = @"contacts.csv";
            string content = @"content.csv";
            string[] delimiter = { "£&%" };
            string read_contents;

            using (StreamReader streamReader = new StreamReader(content, Encoding.UTF8))
                read_contents = streamReader.ReadToEnd();

            string sar_contacts = File.ReadAllText(contacts);
            List<string> contactsToReplace = sar_contacts.Split(delimiter, StringSplitOptions.RemoveEmptyEntries).ToList();

            int i = 0;
            foreach (var wordToCensor in contactsToReplace)
            {
                read_contents = Strings.Replace(read_contents, wordToCensor, "######", 1, -1, Constants.vbTextCompare);
                Console.WriteLine(++i); // so we know where we are
            }

            File.WriteAllText(@"filtered.csv", read_contents);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...