2015-07-02 3 views
0

Я хотел бы прочитать текстовый файл, который выглядит ниже. У этого есть имена геометрии -> «hvac, OUTLET, INLET, Lamelle, duct and wall»Чтение текстового файла для ключевого слова specfic включено внутри скобок '{'

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

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

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

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; 
    } 
} 
+0

Вы не хотите использовать C++ и стандартные классы OpenFOAM? – Petr

+0

И как этот словарь сгенерирован? Потому что в общем случае проблема не так проста из-за богатых возможностей, которые OpenFOAM предлагает в своем словаре. Рассмотрим, например, '$' -референции в значениях ввода, например, 'baseType wall; .... duct {type $ baseType; ...} '. – Petr

ответ

0

Ответ зависит от того, хотите ли вы поддерживать весь общий формат словаря 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, что позволит вам сделать это всего за пару строк кода.

+0

Да ... Мне нужно только в этом формате. –

+0

Спасибо за ваше замечательное решение! Это сработало. –