配置文件特殊格式解析算法或现有方案?
最近尝试在做《方舟:生存进化》的配置项目自动解析,可以用软件来可视化配置项目。
项目文件是一个 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