配置文件特殊格式解析算法或现有方案?

最近尝试在做《方舟:生存进化》的配置项目自动解析,可以用软件来可视化配置项目。

项目文件是一个 Game.ini,但是里面的配置项目还是很奇特的。

具体大致为下:

配置文件特殊格式解析算法或现有方案?

[demoini]

# 实际从这里开始到结尾只有一行,为了方便观看分为多行;

ConfigOverrideItemCraftingCosts=(

ItemClassString="测试项目", # 一般属性值

ToClass="ClassXXX"

BaseCraftingResourceRequirements=( # 类似于数组

(ResourceItemTypeString="PrimalItemStructure_BrickRoof_II_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=True),

(ResourceItemTypeString="PrimalItem_WeaponLongBow_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=False),

(ResourceItemTypeString="PrimalItemStructure_TanningRack_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=False)

),

Other=(Name="XXXXXX",Age=14), # 属性值也是可以嵌套的

End=1.000000

)

准确的说是一行显示,我只是为了方便观看,显示为多行。

我已经使用 Node 的 ini 模块来解析成 ConfigOverrideItemCraftingCosts=..... 这种,但是后面的值还是需要自己手动解析吗?自己尝试了一下似乎不是很容易手动解析。

请问这种格式的文件,有没有相关的现成解析方案?

以下是一些原始数据:(Game.ini)

[/script/shootergame.shootergamemode]

PvPZoneStructureDamageMultiplier=6.000000

bFlyerPlatformAllowUnalignedDinoBasing=False

bPassiveDefensesDamageRiderlessDinos=False

bDisableStructurePlacementCollision=False

onfigOverrideItemCraftingCosts=(ItemClassString="PrimalItemStructure_BrickRoof_II_C",BaseCraftingResourceRequirements=((ResourceItemTypeString="PrimalItem_WeaponLongBow_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=False)))

NPCReplacements=(FromClassName="Achatina_Character_BP_Aberrant_C",ToClassName="ChalkGolem_Character_BP_C")

NPCReplacements=(FromClassName="Angler_Character_BP_Aberrant_C",ToClassName="")

NPCReplacements=(FromClassName="Ankylo_Character_BP_Aberrant_C",ToClassName="Salmon_Character_Aberrant_C")

NPCReplacements=(FromClassName="Arthro_Character_BP_Aberrant_C",ToClassName="Spino_Character_BP_Aberrant_C")

ConfigOverrideItemCraftingCosts=(ItemClassString="PrimalItemStructure_BrickWallWithWindow_II_C",BaseCraftingResourceRequirements=())

ConfigOverrideItemCraftingCosts=(ItemClassString="PrimalItemConsumable_Sugar_C",BaseCraftingResourceRequirements=((ResourceItemTypeString="PrimalItemStructure_BrickRoof_II_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=True),(ResourceItemTypeString="PrimalItem_WeaponLongBow_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=False),(ResourceItemTypeString="PrimalItemStructure_TanningRack_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=False)))

ConfigOverrideItemCraftingCosts=(ItemClassString="PrimalItemStructure_Yurt_C",BaseCraftingResourceRequirements=((ResourceItemTypeString="PrimalItem_WeaponLongBow_C",BaseResourceRequirement=1.000000,bCraftingRequireExactResourceType=False)))

OverridePlayerLevelEngramPoints=0

OverridePlayerLevelEngramPoints=8

OverridePlayerLevelEngramPoints=8

目的只有一个,将其解析成 JSON 格式或任意支持遍历识别的对象。

有什么算法能解决这个问题吗?或者某些现有的解决方案?


回答:

没接触过,但是看这个格式似乎不难解析
((->[{
))->}]
(->{
)->}
=->:
还有True->true这种细节,对应替换后好像就类JSON了,可能不能用标准JSON.parse来解析 可试着用 eval
纯属猜测


let ini = `你贴的Game.ini`;

const res = eval(`({${ini.split('\n').splice(1).join(',')

.replace(/\(\)/g, '[]').replace(/\(\(/g, '[{').replace(/\)\)/g, '}]')

.replace(/\(/g, '{').replace(/\)/g, '}').replace(/=/g, ':')

.replace(/True/g, 'true').replace(/False/g, 'false')}})`);

console.log(res)

按我设想替换后还是可以解析的,但是因为配置项里面有重复键,在js中只保留最后一项,这个部分如果要处理起来 转成数组 就比较麻烦不是几个replace能搞定了。

以上是 配置文件特殊格式解析算法或现有方案? 的全部内容, 来源链接: utcz.com/a/156994.html

回到顶部