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

C#如何解析键值无分隔符的字符串及实现G代码行变量赋值

C#实现两个解析需求:无分隔符键值对与G代码行解析

一、解析无分隔符的键值对字符串

先来说这个无分隔符的键值对解析——比如像X-0.336Y13.564Z0.5这种格式,键是单个大写字母,值是带正负的小数或整数。咱用正则表达式来匹配最省心,效率还高。

实现代码

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

public static class KeyValueParser
{
    // 预编译正则:匹配大写字母键 + 带正负的小数/整数值
    private static readonly Regex _keyValueRegex = new Regex(@"([A-Z])([-+]?\d+(\.\d+)?)", RegexOptions.Compiled);

    public static Dictionary<char, double> ParseKeyValueString(string input)
    {
        var keyValuePairs = new Dictionary<char, double>();
        
        if (string.IsNullOrWhiteSpace(input))
            return keyValuePairs;

        // 捕获所有符合格式的键值对
        var matches = _keyValueRegex.Matches(input);
        foreach (Match match in matches)
        {
            char key = char.Parse(match.Groups[1].Value);
            if (double.TryParse(match.Groups[2].Value, out double value))
            {
                keyValuePairs[key] = value;
            }
        }

        return keyValuePairs;
    }
}

代码说明

  • 正则表达式([A-Z])([-+]?\d+(\.\d+)?):
    • ([A-Z]):捕获单个大写字母作为键
    • ([-+]?\d+(\.\d+)?):捕获可选正负号、整数部分,以及可选的小数部分
  • RegexOptions.Compiled预编译正则,提升多次调用的性能
  • 用double.TryParse避免解析失败抛出异常,容错性拉满

二、逐行解析G代码行,赋值x/y/z变量

接下来是G代码的解析需求,规则很明确:每行提取X、Y、Z对应的值,没有的话就设为100000。咱直接复用上面的键值对解析逻辑,不用重复造轮子。

实现代码

using System;
using System.IO;

public static class GCodeParser
{
    public static void ParseGCodeFile(string filePath)
    {
        if (!File.Exists(filePath))
        {
            Console.WriteLine("指定文件不存在,请检查路径!");
            return;
        }

        // 逐行读取文件,内存友好,适合大文件
        foreach (string line in File.ReadLines(filePath))
        {
            var parsedValues = KeyValueParser.ParseKeyValueString(line);
            
            // 赋值逻辑:存在对应键就取数值,否则设为100000
            double x = parsedValues.TryGetValue('X', out double xVal) ? xVal : 100000;
            double y = parsedValues.TryGetValue('Y', out double yVal) ? yVal : 100000;
            double z = parsedValues.TryGetValue('Z', out double zVal) ? zVal : 100000;

            // 这里可以根据业务需求替换成存储到对象、写入数据库等操作
            Console.WriteLine($"原行内容: {line}");
            Console.WriteLine($"解析结果: x={x}, y={y}, z={z}\n");
        }
    }
}

使用示例

假设你有个gcode_sample.txt文件,内容如下:

G1 Z0.500 F7800.000
G1 X-0.336 Y13.564 F7800.000
G0 X10 Y20 Z30

调用GCodeParser.ParseGCodeFile("gcode_sample.txt");,输出结果会是:

原行内容: G1 Z0.500 F7800.000
解析结果: x=100000, y=100000, z=0.5

原行内容: G1 X-0.336 Y13.564 F7800.000
解析结果: x=-0.336, y=13.564, z=100000

原行内容: G0 X10 Y20 Z30
解析结果: x=10, y=20, z=30

代码说明

  • File.ReadLines逐行读取,不会一次性加载整个文件到内存,处理大G代码文件更高效
  • 复用KeyValueParser的解析逻辑,减少重复代码维护成本
  • Dictionary.TryGetValue安全获取值,避免键不存在时抛出异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:35:23