【问题标题】:Getting specific text in a paragraph [closed]在段落中获取特定文本[关闭]
【发布时间】:2019-09-29 23:01:39
【问题描述】:

您好,我正在使用这个 c# windows 窗体 我想在(嗯)之前得到这个数字 有时会超过 50 个数据。

示例格式:

19/09/27    9:17:37
SOT404 Sn_Ni LEADSr.rtn
1
Batch no.      1
Date / Shift:  19-09-27A
User Name:     OLIVER
[DATA]

       1 Sn                 10.259(um)  
       2 Sn                 10.965(um)  
       3 Sn                 10.921(um)  
       4 Sn                  9.690(um)  
       5 Sn                  9.774(um)  
       6 Sn                 10.312(um)  

                Mean            Std. dev.       Range
Sn                10.320          0.5433           1.275
                Max.            Min.            Cpk
Sn                10.965           9.690         2.04
                UCL             LCL
Sn                15.000           7.000

预期输出:

 10.259
 10.965
 10.921
 9.690
 9.774
 10.312

我现在只是将它存储在数组中,不知道下一步。

 private void FormatRawData_2(string rawData)
        {
            string[] data = Regex.Split(rawData, "\r\n");
            if (rawData.Contains("[DATA]"))
            {
                int index = Array.IndexOf(data, "[DATA]");
            }
            else {
                MessageBox.Show("Received data is not complete");
            }
        }

更新我的代码: 笔记: Config.DataColumn 的值等于 3

 private void FormatRawData_2(string rawData)
        {

            string[] data = Regex.Split(rawData, "\r\n");
            if (rawData.Contains("[DATA]"))
            {
                int index = Array.IndexOf(data, "[DATA]");
                //int markIndex = Array.IndexOf(data, "");
                for (int ctr = index + 1; ctr < data.Length;ctr++ ) 
                {
                    string[] lineData = Regex.Split(data[ctr], @"[\s+\t\n]");


                  int dataCtr = 1;
                  for (int lineCtr = 0; lineCtr < lineData.Length - 1; lineCtr++)
                  {
                      if (lineData[lineCtr] != string.Empty)
                      {
                          if (dataCtr == Config.DataColumn)
                          {
                              SetTextProcessed(lineData[lineCtr]);
                              break;
                          }
                          dataCtr++;
                      }
                  }

                }


            }
            else {

            }
        }

现在得到结果:

10.259(um)
10.965(um)
10.921(um)
9.690(um)
9.774(um)
10.312(um)
dev.
0.5433
9.690

已经很接近了。

【问题讨论】:

  • 每一行都可以找到(um)的索引:indexEnd。然后反向搜索indexStart 处的第一个空格字符。然后取 indexStart+1 和 indexEnd-1 之间的子字符串。根据格式,似乎 indexEnd 对于每一行都是相同的。
  • 但它并不总是(嗯)它有时会改变括号内的文本字符。我不明白你的意思我在这方面有点新
  • 它并不总是(嗯)它有时会改变括号内的文本字符所以你能定义你需要的模式来识别你想要的数据吗?您如何知道需要开始收集数据、数据的格式以及如何知道需要停止收集数据?
  • 我无法控制其他程序生成的格式

标签: c# arrays .net


【解决方案1】:

你可以试试这个:

using System.IO;
using System.Collections.Generic;

static void Test()
{
  var lines = File.ReadAllLines(@"c:\\sample.txt");
  var dataUM = new List<string>();
  var dataColumn1 = new List<string>();
  var dataColumn2 = new List<string>();
  var dataColumn3 = new List<string>();
  int indexEndColumn1 = 24;
  int indexEndColumn2 = 40;
  int indexEndColumn3 = 0; /* data provided by OP are not aligned */
  Action<string, int, List<string>> extractData = (str, end, list) =>
  {
    int indexStart = -1;
    for ( int index = end - 1; index >= 0; index-- )
      if ( str[index] == ' ' )
      {
        indexStart = index;
        break;
      }
    if ( indexStart != -1 )
      list.Add(str.Substring(indexStart + 1, end - 1 - indexStart));
  };
  foreach ( string line in lines )
  {
    int indexEnd = line.IndexOf("(um)");
    if ( indexEnd != -1 )
      extractData(line, indexEnd, dataUM);
    else
    if ( line.StartsWith("Sn") )
    {
      extractData(line, indexEndColumn1, dataColumn1);
      extractData(line, indexEndColumn2, dataColumn2);
      extractData(line, indexEndColumn3, dataColumn3);
    }
  }
  Action<string, List<string>> printData = (title, list) =>
  {
    Console.WriteLine(title);
    foreach ( var item in list )
      Console.WriteLine(item);
    Console.WriteLine();
  };
  printData("Data content for (um)", dataUM);
  printData("Data content for Column 1", dataColumn1);
  printData("Data content for Column 2", dataColumn2);
  printData("Data content for Column 3", dataColumn3);
}

它输出:

Data content for (um)
10.259
10.965
10.921
9.690
9.774
10.312

Data content for Column 1
10.320
10.965
15.000

Data content for Column 2
0.5433
9.690
7.000

Data content for Column 3

【讨论】:

  • 我在上面更新代码的方式并不总是(嗯)
【解决方案2】:

这是我为获得预期结果所做的工作,请告诉我你在我的回答中看到的复杂情况 Config.DataColumn 等于 3

 private void FormatRawData_2(string rawData)
        {

            string[] data = Regex.Split(rawData, "\r\n");
            if (rawData.Contains(@Config.DataPart))
            {
                int index = Array.IndexOf(data, @Config.DataPart);

                for (int ctr = index + @Config.RowDataStart; ctr < data.Length; ctr++)
                {
                    string[] lineData = Regex.Split(data[ctr], @"[\s+\t\n]");

                    int dataCtr = 1;

                    for (int lineCtr = 0; lineCtr < lineData.Length; lineCtr++)
                    {
                        if (lineData[lineCtr] != string.Empty)
                        {

                            if (dataCtr == Config.DataColumn)
                            {
                                if (lineData[lineCtr].Contains(")"))
                                {
                                    SetTextProcessed(lineData[lineCtr].Remove(lineData[lineCtr].Length - 4));
                                    break;
                                }
                            }
                            dataCtr++;
                        }

                    }

                }

            }
            else
            {
                MessageBox.Show("Received data is not complete");
            }
        }

【讨论】:

  • 此代码与您的问题不匹配,也不符合您指定的预期输出。所以我不明白你的目标了。
  • 它确实得到了预期的输出
  • 它不是你在问题中写的:“我想在(嗯)之前得到这个数字”和“预期输出:10.259 10.965 10.921 9.690 9.774 10.312”。您后来添加了一些关于“Config.DataColumn 等于 3”的内容不太清楚。现在在这里添加一个“RowDataStart”。所以你的算法不会输出你要求的预期输出......但如果你现在得到想要的结果,那很好。
  • 抱歉让你们混淆了,我的问题似乎缺乏信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多