使用键值对解析字符串,其中键和值c之间没有char#

时间:2018-03-27 20:57:21

标签: c# string parsing split key-value

我试图逐行解析文件,每次设置变量等于行中的值。

示例行将是:

G1 Z0.500 F7800.000
G1 X-0.336 Y13.564 F7800.000
G1 X3.205 Y13.493 E3.63071 F1800.000

我会有变量:

double x;
double y;
double z;

假设我解析了第一行,我的输出应该是:

x = 100000;
y = 100000;
z = 0.5;

如果我解析了第二行,我的输出应该是:

x = -0.336;
y = 13.564;
z = 100000;

第三行只是可能出现的另一条线,但都非常相似。如果密钥未出现在字符串中,则值将设置为100,000。

我试图使用这样的代码:

char[] delimiters = { 'X', 'Y', 'Z'};
string[] words = line.Split(delimiters);

但是第一行返回了:

z = 0.500 F7800.000

解析这些键值对的每一行的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

这应该让你开始......

        using (StreamReader sr = new StreamReader("data.txt"))
        {
            while (!sr.EndOfStream)
            {
                string line = sr.ReadLine();
                if (line != null)
                {
                    string[] items = line.Split(' ');
                    decimal? x, y, z = null;
                    for (int i = 1; i < items.Length; i++)
                    {
                        if (items[i].ToLower().StartsWith("x"))
                        {
                            x = decimal.Parse(items[i].Substring(1));
                            Console.WriteLine($"x = {x}");
                        }
                        else if (items[i].ToLower().StartsWith("y"))
                        {
                            y = decimal.Parse(items[i].Substring(1));
                            Console.WriteLine($"y = {y}");
                        }
                        else if (items[i].ToLower().StartsWith("z"))
                        {
                            z = decimal.Parse(str);
                            Console.WriteLine($"y = {z}");
                        }
                        else
                        {
                            continue;
                        }
                    }
                }
            }
        }

答案 1 :(得分:0)

您可以做的一件事是创建一个表示您关注的数据的简单类,该类似乎是XYZ。然后,您可以创建一个static方法,该方法知道如何从字符串创建类的实例。

例如:

public class XYZData
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Z { get; set; }

    public static XYZData Parse(string input)
    {
        var xyzData = new XYZData { X = 100000, Y = 100000, Z = 100000 };

        if (string.IsNullOrWhiteSpace(input)) return xyzData;

        var parts = input.Split();

        foreach (var part in parts)
        {
            double result;

            if (part.Length < 2 || 
                !double.TryParse(part.Substring(1), out result)) 
            {
                continue;
            }

            if (part.StartsWith("X", StringComparison.OrdinalIgnoreCase))
            {
                xyzData.X = result;
                continue;
            }
            if (part.StartsWith("Y", StringComparison.OrdinalIgnoreCase))
            {
                xyzData.Y = result;
                continue;
            }
            if (part.StartsWith("Z", StringComparison.OrdinalIgnoreCase))
            {
                xyzData.Z = result;
                continue;
            }
        }

        return xyzData;
    }
}

然后,您可以在阅读文件时填写这些内容的列表:

var filePath = @"f:\public\temp\temp.txt";

var data = new List<XYZData>();

foreach (var fileLine in File.ReadLines(filePath))
{
    data.Add(XYZData.Parse(fileLine));
}