从一行文本中获取特定数据

时间:2016-11-25 12:46:53

标签: c# wpf text split trim

我需要从下面的文本行中提取以下数据(以粗体显示)并将其放入数据网格中;

PERS tooldata t_rrt_ja03579 := [TRUE,[[ -39.643,-0.001,1025.49 ],[ 0.382684,-0.000130001,-0.923889,0.000120001 < /强>]],[200.9,[ - 88.1,-12.6,359.7],[1,0,0,0],29.347,50.927,18.261]];

从文件中读取此行。我已经设法修剪线,以便摆脱&#34; PERS tooldata&#34;和空格,它给我留下了工具名称。我将它绑定到代码中其他位置的数据网格中的数据,这是步骤1完成。

我的问题是如何单独以粗体提取值并将它们放入双数据声明中?第一个值块(-39.643,-0.001,1025.49)是X,Y,Z坐标值,第二个值(0.382684,-0.000130001,-0.923889,0.000120001)是Q1,Q2,Q3,Q4。

以下是我如何命名

    private void AutoFillToolData(object sender, RoutedEventArgs e)
    {
        // Gives user option to auto populate datagrid
        var AutoFillToolResult = MessageBox.Show("Do you want to auto populate fields?", "Tool Data", MessageBoxButton.YesNo);
        if (AutoFillToolResult == MessageBoxResult.Yes)
        {
            // User directs application to the specified file
            System.Windows.Forms.FolderBrowserDialog folderBrowser = new System.Windows.Forms.FolderBrowserDialog();
            if (folderBrowser.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                // Application looks for specific file and removes unwanted data
                string robotBackupPath = folderBrowser.SelectedPath;
                string allDataPath = robotBackupPath + @"\RAPID\TASK1\SYSMOD\ALL_DATA.sys";
                string[] tLines = File.ReadAllLines(allDataPath);
                List<string> toolDataLines = new List<string>();
                foreach (string tLine in tLines)
                {
                    if (tLine.Contains("PERS tooldata") && !tLine.StartsWith("!"))
                    {
                        if (tLine.Contains("tToolChanger")) continue;
                        if (tLine.Contains("tPointer")) continue;
                        if (tLine.Contains("tHome")) continue;
                        toolDataLines.Add(tLine);
                    }
                }

                foreach (string line in toolDataLines)
                {
                    // Gets the name of the tool
                    ToolData toolData = GetToolNameFromLine(line);

                    // Puts the tool name in the DataGrid 
                    TCPData.Add(toolData);
                }
            }
        }
    }

    private ToolData GetToolNameFromLine(string line)
    {
        // Removes white space at the beggining of line in txt file
        ToolData tooldata = new ToolData();
        string[] spaceSplit = line.Trim().Split(' ');
        string values = spaceSplit[2];

        // Gets Tool Name
        int colonLocation = values.IndexOf(":");
        tooldata.ToolName = values.Substring(0, colonLocation);
        return tooldata;
    }

1 个答案:

答案 0 :(得分:0)

如果您所有的样本都遵循相同的模式,那么提取这些值并不困难:

//First we get all the string after the :=
string tooldata = line.Substring(data.IndexOf(":=") + 2) ;

//Split the string by [        
string[] tooldataArray = tooldata.Split(new char[] { '[' }, StringSplitOptions.RemoveEmptyEntries);
//the second and the third strings are what we are interested in
string xyzValue  = tooldataArray[1].Replace(']' ,' ');
string Q1234value = tooldataArray[2].Replace(']', ' ');

如果在此之后您想获得各个参数,只需按,进行拆分即可。

修改

这会将您想要的所有值提取到double的数组:

string tooldata = data.Substring(data.IndexOf(":=") + 2) ;

string[] tooldataArray = tooldata.Split(new char[] { '[' }, StringSplitOptions.RemoveEmptyEntries);
double[] xyzValue  = tooldataArray[1].Replace(']' ,' ')
                    .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(s => double.Parse(s, CultureInfo.InvariantCulture))
                    .ToArray();
double[] Q1234value = tooldataArray[2].Replace(']', ' ')
                    .Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)
                    .Select(s => double.Parse(s, CultureInfo.InvariantCulture))
                    .ToArray();