Nano Hash - криптовалюты, майнинг, программирование

Как извлечь неизвестное количество текста из файла

Этот вид связан с вопросом , который у меня был ранее о регулярном выражении для поиска для метода, содержащего определенную строку, и кто-то предложил мне использовать этот инструмент MS под названием Roslyn, но он недоступен для VS2010 с момента выхода 2012 года.

Итак, я пишу эту маленькую утилиту, чтобы вести список всех файлов в моем решении, содержащих объявление определенного метода (что-то вроде 3k из 25k файлов перегружает этот метод). Затем я просто хочу отфильтровать этот список файлов только для тех, которые содержат += внутри тела метода.

static void DirSearch(string dir)
{
    string[] files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories);

    foreach (var file in files)
    {
        var contents = File.ReadAllText(file);
        if (contents.Contains("void DetachEvents()"))
        {
            //IF DetachEvents CONTAINS += THEN...
                WriteToFile(file);
        }                
     }
}

Этот метод выполняет итерацию по всем папкам и записывает имя файла в текстовый файл, если он содержит ключевой метод, но я понятия не имею, как извлечь все, что находится в теле метода, поскольку он перегружен, все 3K экземпляры метода разные.

Будет ли лучшим подходом получить индекс имени метода, затем индекс каждого { и }, пока я не столкнусь со следующим модификатором доступа (означающим, что я дошел до конца DetachEvents)? Тогда я мог бы просто искать между indexOfMethod и indexOfEndMethod +=.

Но это звучит очень небрежно, я надеялся, что у кого-то может быть идея получше?

10.12.2013

  • @P.Brian.Mackey Я не понимаю, что ты имеешь в виду. Я не собираюсь изменять какой-либо код своим инструментом, просто скажите мне, в каких из них есть ошибка. Таким образом, я могу только прочитать их содержимое и записать имя файла в локальный файл, если у них есть вопиющие данные, чтобы вернуться и изменить их вручную. Я не ожидаю тревожного количества неправильных данных, но я не хочу вручную проверять файлы 3K ;) 11.12.2013
  • У вас действительно есть 3000 различных перегрузок одного и того же метода в вашей кодовой базе? 11.12.2013
  • @acfrancis Быстрый запуск кода здесь, в моем посте, без какой-либо фильтрации дает текстовый файл с примерно 2,9 тыс. записей или около того. На самом деле они не перегружают метод из одного общего интерфейса, а просто имеют одну и ту же сигнатуру метода (private void DetachEvents()), куда он идет, и, как следует из названия, отсоединяют события от каждого элемента управления на нем. Не совсем то же самое, что перегрузка, но достаточно близко, чтобы я просто назвал это так для простоты. 11.12.2013
  • Хорошо, я думаю, вы могли бы прочитать файл из сигнатуры метода, подсчитывая открытые и закрывающиеся завитки, пока они не сбалансируются (это, вероятно, конец метода), одновременно ища +=. Это не будет точным, потому что вы можете считать вещи в строках или комментариях, но это должно быть довольно близко. 11.12.2013
  • Может ли += быть где-нибудь в теле метода, или вы можете сузить часть синтаксиса, который вы ищете, немного больше? 11.12.2013
  • Это может быть где угодно. Каждый метод DetachEvents() имеет неопределенное количество событий, которые он отделяет от определенного класса. У кого-то один, у кого-то 10, а то и больше. По сути, при копировании и вставке из конструктора, где они назначали обработчики событий элементам, мои товарищи по команде забыли изменить += на -= для удаления. В большинстве случаев они этого не делали, но сегодня, глядя на класс, я заметил, что одно событие не изменилось. Просмотрел более 20 других файлов, и они варьировались от одного или двух событий, которые не были изменены, до неправильного всего тела. 11.12.2013

Ответы:


1

Вы должны сделать это в коде? Это одноразовая утилита для выявления проблемных методов? Почему бы не использовать что-то вроде Notepad++ и его Find in Files возможностей. Вы можете довольно легко отфильтровать свою находку и даже применить регулярное выражение (я думаю). Оттуда вы можете скопировать результаты, которые включают имя файла (например, someclassfile.cs), и получить оттуда список.

10.12.2013
  • Вы правы в том, что это одноразовый инструмент. Ну, я полагаю, что в будущем люди, вероятно, будут ошибочно назначать += вместо -=, но что я могу с этим поделать. Я попытался использовать поиск регулярных выражений, встроенный в Visual Studios, для поиска всего моего решения для нескольких разных вещей (см. вопрос SO, который я связал в верхней части моего поста), и несколько других людей взвесили, сказав, что это будет очень сложно создать регулярное выражение, которое найдет каждый экземпляр проблемы, потому что каждый метод удаляет различное количество обработчиков событий. Кроме того, я не могу представить себе попытку открыть файлы размером 28 КБ в N++ для поиска. 11.12.2013
  • Ограничитель длины комментария!! Я открыт для любого решения, поэтому, если вы знаете, как я могу легко проанализировать список этих неправильных тел методов, используя поиск N++, я весь в ушах. 11.12.2013

  • 2

    Я написал эту действительно небрежную форму winform, которая позволяет пользователю вводить в папку базу кода, имя метода и вопиющий текст, который они ищут. Затем он перебирает каждый файл в каталоге и вызывает этот метод для строки, содержащей весь текст файла. Он возвращает true, если введенные пользователем грубые данные присутствуют, тогда метод, который вызывает это, добавляет файл в список. В любом случае, вот основной код:

        private bool ContainsFlag(string contents)
        {
            int indexOfMethodDec = contents.IndexOf(_method);
            int indexOfNextPublicMethod = contents.IndexOf("public", indexOfMethodDec);
            if (indexOfNextPublicMethod == -1)
                indexOfNextPublicMethod = int.MaxValue;
    
            int indexOfNextPrivateMethod = contents.IndexOf("private", indexOfMethodDec);
            if (indexOfNextPrivateMethod == -1)
                indexOfNextPrivateMethod = int.MaxValue;
    
            int indexOfNextProtectedMethod = contents.IndexOf("protected", indexOfMethodDec);
            if (indexOfNextProtectedMethod == -1)
                indexOfNextProtectedMethod = int.MaxValue;
    
            int[] indeces = new int[3]{indexOfNextPrivateMethod,
                                       indexOfNextProtectedMethod,
                                       indexOfNextPublicMethod};
    
            int closestToMethod = indeces.Min();
            if (closestToMethod.Equals(Int32.MaxValue))
                return false; //This should probably do something different.. This condition is true if the method you're reading is the last method in the class, basically
    
           if (closestToMethod - indexOfMethodDec < 0)
                return false;
    
            string methodBody = contents.Substring(indexOfMethodDec, closestToMethod - indexOfMethodDec);
            if (methodBody.Contains(_flag))
                return true;
            return false;
        }
    

    Много возможностей для улучшения, в основном это всего лишь проверка концепции, которую можно использовать внутри компании дважды в год. Но для моих целей это сработало. Должно быть хорошей отправной точкой для чего-то более сложного, если кому-то это нужно.

    16.12.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..