读取方括号“{”内包含的特定关键字的文本文件
Reading text file for specfic keyword included inside brackets '{'
我想阅读如下所示的文本文件。
它具有几何名称 --> " hvac、OUTLET、INLET、Lamelle、duct 和 wall"
本例中只有6个,但我可能会根据CFD过程的不同模拟而有所不同。
我只想提取几何名称及其对应的 'type'。在我的例子中,几何形状和类型分别是“hvac、OUTLET、INLET、Lamelle、duct 和 wall”和 "wall and patch"。
我应该使用 XML 使用 Parse 还是只搜索 '{\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;
}
}
答案取决于您是否要支持整个通用的 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 类,这样您只需几行代码即可完成此操作。
我想阅读如下所示的文本文件。 它具有几何名称 --> " hvac、OUTLET、INLET、Lamelle、duct 和 wall"
本例中只有6个,但我可能会根据CFD过程的不同模拟而有所不同。
我只想提取几何名称及其对应的 'type'。在我的例子中,几何形状和类型分别是“hvac、OUTLET、INLET、Lamelle、duct 和 wall”和 "wall and patch"。
我应该使用 XML 使用 Parse 还是只搜索 '{\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;
}
}
答案取决于您是否要支持整个通用的 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 类,这样您只需几行代码即可完成此操作。