我有一个日志文件(.txt),其中包含以下信息:
Filename1 - A3332NCDER
Filename2 - B3332NCDER
Filename3 - B1222NCDERE
Filename4 - C1222NCDER
Filename4 - C1222NCDERE
我正在写文件名和日志文件的相应ID,如下所示:
using (StreamWriter logFile = new StreamWriter(logFileName, true))
{
logFile.WriteLine(fileName + " - " + fileID);
}
稍后获取ID我正在执行以下操作:
char[] delimiters = new char[]{'\n','\r','-'};
IList<string> fileIDs = File.ReadAllText(logFileName)
.Split(delimiters, StringSplitOptions.RemoveEmptyEntries)
.Where((lineItem, index) => index % 2 == 1)
.Select(lineItem => lineItem.Trim())
.ToList();
现在,对于每个处理,我将添加日期和时间,如下所示。在某些情况下,id也可以是多个,用逗号分隔。
*****Files processing done at: 9/16/2011 11:30:48 AM *****
Filename1 - A3332NCDER
Filename2 - B3332NCDER
Filename3 - B1222NCDERE
*****Files processing done at: 9/16/2011 12:10:15 AM *****
Filename4 - C1222NCDER
Filename4 - C1222NCDERE,226222105A
我需要从上面的数据中选择ID到IList吗?我能想到的一种方法是先用\ n和\ r分割,然后删除空行&amp;包含日期的行。然后再按' - '拆分,然后将ID添加到列表中。是否可以使用单个linq查询
答案 0 :(得分:1)
这可能是正则表达式的一个很好的应用程序,具体取决于您对文件名的控制程度。但是,任何使用“String.Split”的方法都不适用于包含破折号的文件名。
表达式
(?<=- *|,)[A-Z0-9]+
将匹配示例数据中的每个ID。在行动here at ideone中查看。
“[A-Z0-9] +”描述了大写字母和数字的任意组合,“(?&lt; = - * |,)”部分确保它前面有短划线和一些空格或逗号。
答案 1 :(得分:1)
使用Linq的方法可能是:
List<string> ids = File.ReadAllLines(logFile)
.Where(l => !String.IsNullOrWhiteSpace(l)) // Trim empty lines
.Where(l => l.StartsWith("Filename")) // Just get ID lines
.SelectMany(l => l.Split('-').Skip(1)) // Skip the "FilenameX" section
.SelectMany(ids => ids.Split( // Get IDs (+trim)
new[]{' ',','}, StringSplitOptions.RemoveEmptyEntries)
)
.ToList();