从文件中挑选ID

时间:2011-09-16 06:56:46

标签: linq c#-4.0

我有一个日志文件(.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查询

2 个答案:

答案 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();