如何使用字符串切片从字符串中提取单个数据片段,例如R,P,H

时间:2012-11-21 18:52:56

标签: vb.net

我们有一个包含各个值的字符串,例如23.N.34.H.67等   -

2 个答案:

答案 0 :(得分:1)

由于您的导师已建议切片,请查看使用String.SubString方法是否符合他的要求。我正在使用lambda表达式来确定数组的大小,如果你不想使用它,就像在我的另一个例子中那样使用List。

static void Main(string[] args)
{
    FileStream telData;
    List<int> myNumbers = new List<int>();
    telData = new FileStream(@"C:\temp\inputdata.txt", FileMode.Open);
    StreamReader strmRead = new StreamReader(telData);
    string d = "";
    string tempdata;

    while ((tempdata = strmRead.ReadLine()) != null)
    {
        d += tempdata;
    }
    telData.Close();


    Console.WriteLine(AverageParsedValues(d, 'H'));
    Console.WriteLine(AverageParsedValues(d, 'P'));
    Console.WriteLine(AverageParsedValues(d, 'T'));
    Console.ReadLine();

}

static double AverageParsedValues(string data, char match)
{
    int start;
    int end;
    int[] value = new int[data.Where(c => c == match).Count()];

    int index =0;
    int temp;

    for (int i = 0; i < data.Length-1; i++)
    {
        if (data[i] == match)
        {
            start = data.IndexOf(':', i) + 1;
            end = data.IndexOf(':', start);
            if (int.TryParse(data.Substring(start, end - start), out temp))
            {
                value[index] = temp;
                index += 1;
            }
        }
    }
    return value.Average();
}

编辑:修改后的方法不需要数组或列表:

static double AverageParsedValues(string data, char match)
{
    int start;
    int end;
    int value = 0;
    double count = 0; //Double so that we return a double not an integer
    int temp;

    for (int i = 0; i < data.Length-1; i++)
    {
        if (data[i] == match)
        {
            start = data.IndexOf(':', i) + 1; // Find Start of Data
            end = data.IndexOf(':', start); // Find End of Data
            if (int.TryParse(data.Substring(start, end - start), out temp))
            {
                value += temp;
                count += 1;
            }
        }
    }
    if (count != 0) //Check for divide by zero
        return value / count;
    else
        return 0;
}

答案 1 :(得分:0)

您可以执行以下操作,阅读文本文件中的所有文本(我不确定文本中是否有newLines),然后为每个值提取字符串。之后,您将能够以最适合您的方式解析这些字符串。

            string inputString = File.ReadAllText(@"E:\inputdata.txt");
            List<string> D = new List<string>();
            List<string> H = new List<string>();
            List<string> P = new List<string>();
            List<string> T = new List<string>();
            List<string> R = new List<string>();
            while (inputString.Length > 0)
            {
                int index = inputString.IndexOfAny(new char[] { 'D', 'T', 'H', 'P', 'R' },1);
                string subStr = string.Empty;
                if (index >= 0)
                {
                    subStr = inputString.Substring(0, index - 1);
                    inputString = inputString.Substring(index);
                }
                else
                {
                    subStr = inputString;
                    inputString = string.Empty;
                }
                switch (subStr[0])
                {
                    case 'D':
                        D.Add(subStr.Substring(1).Trim(':'));
                        break;

                    case 'T':
                        T.Add(subStr.Substring(1).Trim(':'));
                        break;

                    case 'H':
                        H.Add(subStr.Substring(1).Trim(':'));
                        break;
                    case 'P':
                        P.Add(subStr.Substring(1).Trim(':'));
                        break;
                    case 'R':
                        R.Add(subStr.Substring(1).Trim(':'));
                        break;
                }

            }