You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PowerShell中按标签精准解析FIX 4.4协议结构化日志

PowerShell 解析FIX 4.4结构化日志方案

实现思路

原有固定索引拆分的方式无法适配字段顺序变动、标签间无空格、重复标签的场景,改用正则精准匹配FIX协议的「数字标签=取值」结构,直接按标签号定位取值,同时自动收集重复标签的所有内容,步骤如下:

  • 首先拆分每行:分隔符前的内容作为开头时间戳
  • 对分隔符后的FIX报文内容,用正则匹配所有标签键值对,兼容标签连写无空格、字段顺序随机的情况
  • 对重复出现的标签(如270、271),按出现顺序存储所有取值
  • 按需求顺序拼接时间戳和目标标签的取值,输出格式化结果

完整实现代码

# 配置参数:修改为实际日志路径、需要提取的标签编号(按输出顺序排列)
$logFilePath = "FIX.log"
$extractTags = @(55, 270, 271)
# FIX标签匹配正则:兼容标签间无空格、多重复标签场景
$tagMatchRegex = [regex]'(\d+)=([^=]+?)(?=\s*\d+=|$)'

Get-Content $logFilePath | ForEach-Object {
    # 跳过空行
    if ([string]::IsNullOrWhiteSpace($_)) { return }
    # 提取行首时间戳
    $lineSplitRes = $_ -split ' : ', 2
    $timeStamp = $lineSplitRes[0].Trim()
    $fixContent = $lineSplitRes[1]

    # 存储标签值:键为标签号,值为该标签所有取值的数组(按报文出现顺序保存)
    $tagValueMap = @{}
    $allTagMatches = $tagMatchRegex.Matches($fixContent)
    foreach ($match in $allTagMatches) {
        $tagId = [int]$match.Groups[1].Value
        $tagVal = $match.Groups[2].Value.Trim()
        if (-not $tagValueMap.ContainsKey($tagId)) {
            $tagValueMap[$tagId] = @()
        }
        $tagValueMap[$tagId] += $tagVal
    }

    # 拼接输出结果
    $resultParts = @($timeStamp)
    foreach ($tag in $extractTags) {
        if ($tagValueMap.ContainsKey($tag)) {
            $resultParts += $tagValueMap[$tag]
        }
    }
    $resultParts -join ' '
}

效果说明

用提供的示例日志行运行代码,输出结果完全符合预期:

20220606-21:10:21.930 US30 32921.6 2000000 32931.4 2000000

方案不依赖字段固定位置,后续如果需要提取其他标签(比如49、56、35这类),只需要修改$extractTags数组里的标签编号即可,不需要调整核心解析逻辑。

内容的提问来源于stack exchange,提问作者mart

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:18:09