Мультилиния regex ищет в целом файле

Я всегда думал, что MVVM и PresntationModel http://martinfowler.com/eaaDev/PresentationModel.html являются по существу тем же самым. PresentationModel намного легче заявить. Я использовал его успешно в колебании Java, формах окон, WPF и Silverlight. Если Вы думаете с точки зрения разделения проблем, Модель Представления имеет много смысла. У Вас есть один класс, чей только касаются, предоставляет Представлению дружественную Модель. Действительно не имеет значения, что технология используется для показа его на экране. Это могло бы изменить некоторые детали реализации, но разделение проблем независимо является хорошей идеей, неважно, как Вы показываете информацию. Из-за того разделения Вы можете легко тесты записи против своей модели представления независимо от технологии представления. Таким образом, это плюс.

8
задан Jon Seigel 19 March 2010 в 15:52
поделиться

6 ответов

Ответ:
Нет простого способа

Я нашел StreamRegex-Class , который мог бы делать то, что я ищу.
Из того, что я мог понять алгоритм:

  • Начать с начала файла с пустым буфером
  • do (
    • добавить кусок файла в буфер
    • , если в буфере есть совпадение
      • отметить совпадение
      • удалить все данные, которые появились перед концом совпадения из буфера
  • ), пока что-то еще осталось от файла

Таким образом, нет необходимости загружать полный файл - или хотя бы шансы на загрузку в память полного файла уменьшаются ...
Однако: в худшем случае во всем файле нет совпадений - в этом случае полный файл будет загружен в память.

2
ответ дан 6 December 2019 в 00:57
поделиться

Регулярное выражение - не лучший вариант, особенно с такими большими объемами текста. Создайте собственный небольшой синтаксический анализатор:

  • прочтите файл построчно;
  • для каждой строки:
    • перебирает строку char с помощью char, отслеживая любые открывающие / закрывающие строковые литералы
    • , когда вы встречаете '/ *' (и вы не «внутри» строки), сохраните этот номер смещения и цикл, пока не встретите сначала '* /' и сохраните это число

. Это даст вам все начальные и закрывающие номера смещений блоков комментариев. Теперь у вас должна быть возможность заменить их, создав временный файл и записав текст из исходного файла во временный (и написав что-нибудь еще, если вы, конечно, внутри блока комментариев).

Изменить: исходные файлы 2 ГБ ??

1
ответ дан 6 December 2019 в 00:57
поделиться

I would say you should pre-parse/normalize the data before doing your replacements so that each line describes one possible set of data that needs to have replacements applied. Otherwise you get into complications with data integrity that cannot really be solved without a host of other difficulties.

If there is a way to chunk the data into logical blocks then you could build a program that uses a mapreduce pattern to parse the data.

0
ответ дан 6 December 2019 в 00:57
поделиться

Возможно, вы могли бы загрузить 2 строки за раз (или больше, в зависимости от того, сколько строк, по вашему мнению, будут охватывать ваши совпадения), и перекрыть их, например: строки загрузки 1-2, затем строки загрузки следующего цикла 2-3, следующие строки загрузки 3 -4; и выполняйте многострочные регулярные выражения для обеих строк вместе в каждом цикле.

0
ответ дан 6 December 2019 в 00:57
поделиться

I'm with Bart; you really should be using some kind of parser for this.

Or, if you don't mind spawning a child process, you could just use sed (there's a native port on windows, or you can use Cygwin)

0
ответ дан 6 December 2019 в 00:57
поделиться

Если вы не против немного испачкать руки (и ваше регулярное выражение достаточно простое, или, возможно, вы сильно хотите скорости и не боитесь немного пострадать), вы можно использовать Рагель . Он может быть нацелен на C #, хотя на сайте это не упоминается. Вам нужно будет обернуть FileStream, чтобы предоставить буферизованный индексатор, или использовать файл с отображением памяти (с небезопасными указателями) в 64-битном процессе, чтобы использовать это с большими файлами.

0
ответ дан 6 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: