以下是在文本文件
中找到的日志数据集**********************************************************************************
**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");
}
}
你能帮帮我!!!!
答案 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 ......