C#中的拆分问题

时间:2009-06-24 07:23:12

标签: c# parsing string

以下是在文本文件

中找到的日志数据集
**********************************************************************************
**2008/04/06** 00:35:35 193111               1008                O          9448050132# 74                               
**2008/04/06** 00:35:35 193116               1009                 O          9448050132# 74                               
 **12/15/2008**   8:36AM 106  01 090788573                             00:01'23" ..06  
**10/10/2008** 14:32:32 4400 4653  00:00:56 26656            0    0           OG AL# 
 &       0000    0000                                      
N 124 00 8630    T001045 **10/16** 05:04 00:01:02 A 34439242360098
***************************************************************************************

我需要从上述所有行中仅提取日期详细信息(可能是200/04/06或10/16)并将其显示在文本框中。

我知道如果按照以下方式订购数据,如何隔离日期

***************************************************************************************
10/10/2008 14:32:32 4400 4653  00:00:56 26656            0    0           OG AL#

10/10/2008 14:33:29 4400 4653  00:00:02 26656434         0    0           OG LL#

10/10/2008 14:33:31 4400 4653  00:00:11 26656434         0    0           OG LL#
***************************************************************************************

它的代码是:

        StreamReader rr = File.OpenText("C:/1.txt");
        string input = null;
        while ((input = rr.ReadLine()) != null)
        {                
            char[] seps = { ' ' };
            string[] sd = input.Split(seps, StringSplitOptions.RemoveEmptyEntries);

            string[] l = new string[1000];

            for (int i = 0; i < sd.Length; i++)
            {
                l[i] = sd[i];
                textBox4.AppendText(l[i] + "\r\n");

                //The date is 10 characters in length. ex:06/08/2008
                if (l[i].Length == 10)                    
                textBox1.AppendText(l[i]+"\r\n");

                //The time is of 8 characters in length. ex:00:04:09
                if (l[i].Length == 8)
                textBox2.AppendText(l[i] + "\r\n");

                //The phone is of 11 characters in length. ex:9480455302#
                if (l[i].Length == 11)
                textBox3.AppendText(l[i] + "\r\n");                    
            }                
         }

你能帮帮我!!!!

6 个答案:

答案 0 :(得分:4)

在这种情况下,他们最好的选择是使用更准确的正则表达式,不需要任何形式的... 一般的正则表达式是“[0-9] {2} [/] {1} [0-9] {2} [/] {1} [0-9] {4}”你可以调整它以适合你的需要,在匹配中你可以找到匹配值,这是确切的日期.. 我碰巧在Silverlight http://regexhero.net/

中看到了一个很好的正则表达式求值器

答案 1 :(得分:2)

我在控制台应用中使用您提供的文本尝试了正则表达式。这有效:

        Regex reg = new Regex(@"\d{4}/\d{2}/\d{2}|\d{2}/\d{2}/\d{4}|\d{2}/\d{2}");

        string str = @"2008/04/06 00:35:35 193111 1008 O 9448050132# 74
           2008/04/06 00:35:35 193116 1009 O 9448050132# 74
           12/15/2008 8:36AM 106 01 090788573 00:01'23' ..06
           10/10/2008 14:32:32 4400 4653 00:00:56 26656 0 0 OG AL# & 0000 0000
           N 124 00 8630 T001045 10/16 05:04 00:01:02 A 34439242360098";

        MatchCollection mc = reg.Matches(str);

        foreach (Match m in mc)
        {
            Console.WriteLine(m.Value);
        }

我认为您可以逐行读取行并从每行获取匹配,并将它们保存在某些列表或数组中以供稍后使用。

答案 2 :(得分:2)

您的代码中存在一些奇怪之处。最值得注意的是,while循环中的以下行:

string[] l = new string[1000];

这将为while循环中的每一轮创建一个1000元素的字符串数组。稍后,您将仅在该数组中使用元素i,而不使用其他999个元素。从剩下的代码来看,你也可以简单地使用sd[i]

另外,我猜测textBox1,textBox2和textBox3永远不应该包含相同的值;如果一个值进入其中一个,它应该永远不会进入另一个(除了textBox4似乎收集所有数据)。一旦找到正确的文本框,就没有必要继续测试该值。

最后是while循环中的以下行:

char[] seps = { ' ' };

这将为while循环中的每一轮创建一个相同的字符数组;你可以在循环之外移动它,只需重复使用相同的数组。

日期检测;根据您提供的数据,日期是唯一包含/字符的数据,因此您可以测试该数据而不是长度。

您可以尝试以下操作:

StreamReader rr = File.OpenText("C:/1.txt");
string input = null;
char[] seps = { ' ' };
while ((input = rr.ReadLine()) != null)
{    
    string[] sd = input.Split(seps, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 0; i < sd.Length; i++)
    {
        textBox4.AppendText(sd[i] + "\r\n");

        if (sd[i].Contains("/"))
        {
            // The string contains a / character; assume it is a date
            textBox1.AppendText(sd[i] + "\r\n");
        }
        else if (sd[i].Length == 8)
        {
            //The time is of 8 characters in length. ex:00:04:09
            textBox2.AppendText(sd[i] + "\r\n");
        }
        else if (sd[i].Length == 11)
        {
            //The phone is of 11 characters in length. ex:9480455302#
            textBox3.AppendText(sd[i] + "\r\n");
        }
    }                
 }

答案 3 :(得分:0)

Regex is the best choice if you consider to an iterative approach

 while ((input = rr.ReadLine()) != null)
{
   foreach(var item in input.Split(' ') )
{
    if(item.Contains("/"))
            textBox4.AppendText( item + "\r\n");

}



  }

答案 4 :(得分:0)

您应该使用正则表达式在日志文件中查找日期。日期格式的正确正则表达式为:

@"(\d{2}|\d{4}){1}/\d{2}(/\d{2}|\d{4})*"

因为这将处理dd / mm / yyyy或yyyy / mm或dd / mm等

这是您可以使用的C#代码:

通话功能:

private static void RegexGetDates()
{
    string fileText = File.ReadAllText("..\\..\\Data\\RegexSample2.txt");

    List<string> matchesList = MyRegEx.GetMatchedDates(fileText);
    foreach (string s in matchesList)
        Console.WriteLine(s);
}

从输入字符串中获取日期的函数:

/// <returns>Returns all dates in logString as List<string><returns>
public static List<string> GetMatchedDates(String logString)
{
    List<string> dateList = new List<string>();
    Regex r;
    // Matches all the data between the quotes inside var matches
    r = new Regex(@"(\d{2}|\d{4}){1}/\d{2}(/\d{2}|\d{4})*", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
    for (Match m = r.Match(logString); m.Success; m = m.NextMatch())
    {
        dateList.Add(m.Value);
    }

    return dateList;
}

答案 5 :(得分:-1)

看起来日期中有一个/,其中你可以用它来获得一个索引,然后回到你到达行的起点或空格然后前进直到你到达一个空格。

伪代码:

获取第一行/在行中的位置

index = position

startpos,endpos;

而索引!= 0

而char [index]!=''

index-- //这样做直到你处于约会的开始            (即日期前的空间线的开始    //找到索引?     startpos = index

指数=位置 而char [index]!=''    index ++ //这样做,直到你在日期之后的空间

//找到索引?

endpos = index

date = substring(startpos,endpos - startpos)

P.S。我吮吸RegEx ......