Выбор идентификаторов из файла - PullRequest
2 голосов
/ 16 сентября 2011

У меня есть файл журнала (.txt), в котором есть следующая информация:

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

Теперь для каждой обработки я добавляю дату и время, как показано ниже. Также в некоторых случаях идентификаторы могут быть кратными, которые разделяются запятой.

*****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, а затем удалить пустые строки и строки, содержащие дату. Затем снова разделите на «-» и добавьте идентификаторы в список. Можно ли сделать это одним запросом linq

Ответы [ 2 ]

1 голос
/ 16 сентября 2011

Подход с использованием 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();
1 голос
/ 16 сентября 2011

Это может быть хорошим приложением для регулярных выражений, в зависимости от того, насколько вы контролируете имена файлов. Но тогда любой подход, использующий «String.Split», также не работает с именами файлов, содержащими тире.

Выражение

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

будет соответствовать каждому идентификатору в ваших данных образца. Посмотрите это в действии здесь на ideone .

«[A-Z0-9] +» описывает любую комбинацию заглавных букв и цифр, а часть «(? <= - * |,)» гарантирует, что этому предшествует либо тире и некоторые пробелы запятая. </p>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...