Чтение текстового файла для определенного ключевого слова, заключенного в скобки '{'

Я хотел бы прочитать текстовый файл, как показано ниже. Он имеет названия геометрии --> "hvac,OUTLET,INLET,Lamelle,duct and wall"

В данном случае только 6, но я могу варьироваться в зависимости от различного моделирования процесса CFD.

Я хотел бы извлечь только имена геометрии и соответствующий им «тип». В моем случае геометрия и типы: «hvac, OUTLET, INLET, Lamelle, duct and wall» и «wall and patch» соответственно.

Должен ли я использовать Parse с использованием XML или просто искать строку после '{\n' и '}\n' Keyword .

geometry
{
    hvac
    {
        type            wall;
        inGroups        1(wall);
        nFaces          904403;
        startFace       38432281;
    }
    OUTLET
    {
        type            patch;
        nFaces          8228;
        startFace       39336684;
    }
    INLET
    {
        type            patch;
        nFaces          347;
        startFace       39344912;
    }
    Lamelle
    {
        type            wall;
        inGroups        1(wall);
        nFaces          204538;
        startFace       39345259;
    }
    duct
    {
        type            wall;
        inGroups        1(wall);
        nFaces          535136;
        startFace       39549797;
    }
    wall
    {
        type            wall;
        inGroups        1(wall);
        nFaces          118659;
        startFace       40084933;
    }
}

person Balaji Spades    schedule 02.07.2015    source источник
comment
Вы не хотите использовать c++ и стандартные классы OpenFOAM?   -  person Petr    schedule 02.07.2015
comment
И как создается этот словарь? Потому что в общем случае проблема не так проста из-за богатых возможностей, которые предлагает OpenFOAM в своем формате словаря. Рассмотрим, например, $-ссылки в значениях входа, такие как baseType wall; .... duct { type $baseType; ... }.   -  person Petr    schedule 02.07.2015
comment
Вы можете использовать утилиту FoamDictionary. Он был разработан для этой цели   -  person s.ouchene    schedule 06.09.2019


Ответы (1)


Ответ зависит от того, хотите ли вы поддерживать весь общий формат словаря OpenFOAM или нет.

Если вам нужно только поддерживать формат, аналогичный тому, что вы показали в вопросе, тогда подойдет простое регулярное выражение, например \b(\w+)\s+{\s+type\s+(\w+);: https://regex101.com/r/yV8tK2/1. Это может быть вашим вариантом, если вы полностью контролируете создание этого словаря, хотя в этом случае вам может быть еще проще получить необходимую информацию непосредственно из кода, создающего словарь.

Однако формат словарей OpenFOAM намного богаче вашего примера. Он может разрешать директивы #include, может разрешать регулярные выражения в качестве ключей, может разрешать ссылки на другие ключи с использованием синтаксиса $, может разрешать комментарии, фрагменты кода C++ и, возможно, многое другое (я не претендую на то, что знаю это хорошо). Типичным примером могут быть два словаря:

---- File data.incl:

baseType wall;

---- File data

#inputMode merge;
#include "data.incl"

geometry {
    /* foo {    
        type wrongType; // a commented entry
    } */ 
    foo {
        type $baseType; // this will expand to wall
        ...
    }
    "(bar|buz)" {  // this will match bar and buz
         ...
    } 
}

Если вам нужно распарсить любой такой словарь, то я настоятельно рекомендую вам писать код на C++ и использовать стандартные классы OpenFOAM, которые позволят вам сделать это всего за пару строк кода.

person Petr    schedule 02.07.2015