Linq 领料ID';这是一个文件

Linq 领料ID';这是一个文件,linq,c#-4.0,Linq,C# 4.0,我有一个日志文件(.txt),其中包含以下信息: Filename1 - A3332NCDER Filename2 - B3332NCDER Filename3 - B1222NCDERE Filename4 - C1222NCDER Filename4 - C1222NCDERE using (StreamWriter logFile = new StreamWriter(logFileName, true)) { logFile.WriteLine(fileName +

我有一个日志文件(.txt),其中包含以下信息:

Filename1 -  A3332NCDER
Filename2 -  B3332NCDER
Filename3 -  B1222NCDERE
Filename4 -  C1222NCDER
Filename4 -  C1222NCDERE
using (StreamWriter logFile = new StreamWriter(logFileName, true))
{
    logFile.WriteLine(fileName + "   - " + fileID);
}
我正在将文件名和相应的ID写入日志文件,如下所示:

Filename1 -  A3332NCDER
Filename2 -  B3332NCDER
Filename3 -  B1222NCDERE
Filename4 -  C1222NCDER
Filename4 -  C1222NCDERE
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(); 

我需要从上面的数据中选择IList中的ID?我可以想到的一种方法是先按\n拆分,然后删除空行&包含日期的行。然后再次以“-”分隔,然后将ID添加到列表中。是否可以使用单个linq查询执行此操作这可能是正则表达式的一个很好的应用程序,具体取决于您对文件名的控制程度。但是,任何使用“String.Split”的方法也不适用于包含破折号的文件名

表情

(?<=- *|,)[A-Z0-9]+

(?使用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();
List id=File.ReadAllLines(日志文件)
.Where(l=>!String.IsNullOrWhiteSpace(l))//修剪空行
.Where(l=>l.StartsWith(“Filename”)//只需获取ID行
.SelectMany(l=>l.Split('-')。跳过(1))//跳过“FilenameX”部分
.SelectMany(id=>ids.Split(//获取id(+trim)
新[]{“”,','},StringSplitOptions.RemoveEmptyEntries)
)  
.ToList();

StartsWidth(“文件名”)
看起来不是很灵活。也许“!StartsWidth(“****””)会更好。@Jens:这确实取决于文件输出格式……使用我的方法有一个优点,就是忽略将来的任何附加行,前提是“数据总是使用相同的模式写入。不过,这两种模式都适用于此数据集。