2012-06-07 7 views
0

Я пытаюсь прочитать следующий текстовый файл:LINQ итерация по результатам

Author 
    { 
    Name xyz 
    blog www.test.com 
    rating 123 
    }  
    Author 
    { 
    Name xyz 
    blog www.test.com 
    rating 123 
    } 
    Author 
    { 
    Name xyz 
    blog www.test.com 
    rating 123 
    } 
    Author 
    { 
    Name xyz 
    blog www.test.com 
    rating 123 
    } 

Я использую следующий фрагмент кода, чтобы принести мой автор записи:

public static IEnumerable<string> GetAuthors(string path, string startfrom, string endto) 
     { 
      return File.ReadLines(path) 
       .SkipWhile(line => line != startfrom) 
       .TakeWhile(line => line != endto); 
     } 



public static void DoSomethingWithAuthors(string fileName) 
     { 
      var result = GetAuthors(fileName, "AUTHOR", "}").ToList(); 
     } 

выше только возвращает мне один автор Детали. Мог бы кто-нибудь любезно показать мне, как забрать всех авторов за один раз, чтобы я мог посыпать объект. Огромное спасибо!!

+1

LINQ не предназначен для разбора. Вы должны разбирать файл по-другому. –

ответ

0

Я редко рекомендую это, но если структура файла является предикативной, вы можете даже использовать регулярное выражение, чтобы получить ваши данные автора. Поскольку объекты, которые вы хотите инициализировать, не являются сложными, вы можете сопоставить бит Author и принимать значения из групп соответствия регулярных выражений.

регулярное выражение, чтобы соответствовать авторам было бы что-то вроде этого:

Author\s*{\s*Name\s+(.*?)\s+blog\s+(.*?)\s+rating\s+(.*?)\s*} 

Ваши ценности будут в группе 1,2 и 3.

EDIT:

, если он не имеет значения для вас, вы можете использовать метод ReadToEnd(), а затем вы можете проанализировать содержимое всего файла в виде строки:
http://msdn.microsoft.com/en-us/library/system.io.streamreader.readtoend(v=vs.100).aspx

Что касается решения регулярных выражений - проверить это:
http://msdn.microsoft.com/en-us/library/twcw2f1c.aspx

Адаптированная версия - это, возможно, потребуется настройки, но в целом он должен работать:

string text = [yourInputFileAsString] 
     string pat = @"Author\s*{\s*Name\s+(.*?)\s+blog\s+(.*?)\s+rating\s+(.*?)\s*}"; 

     Regex r = new Regex(pat, RegexOptions.IgnoreCase | RegexOptions.Singleline); 

     Match m = r.Match(text); 

     var authors = new List<Author>(); 
     while (m.Success) 
     { 
     var name = m.Groups[1].Value; 
     var blog = m.Groups[2].Value; 
     var rating = m.Groups[3].Value; 
     var author = new Author(name, blog, rating); 
     authors.Add(author); 

     m = m.NextMatch(); 
     } 
+0

Хорошо, проблема сейчас не в том, чтобы получить коллекцию авторов. Я могу получить только один узел автора, если я не использую takeline. Мне интересно, как я могу получить список авторов, а затем заполнить значения. Можете ли вы показать мне подробный пример того, как это сделать с регулярным выражением, оцените его! – user721

+0

@ user721 - см. Edit –

+0

Это работает отлично! Спасибо!! Только одно: скажем, если значения в файлах могут быть пустыми), (описание поля И.Е будет там, но не значение), и в этом случае регулярное выражение выбирает следующую строку. Также у меня есть другие поля в этом узле, но им интересно только выборка, поэтому в случае, если какое-либо поле пусто, мне нужно сломаться и перейти к следующему значению в пути регулярного выражения. У меня нет большого опыта работы с reges, знаете ли вы, как я мог бы справиться с этим – user721

0

Он остановится на первом }, на котором он наткнулся.

Удалите бит .TakeWhile(line => line != endto), и он должен сработать для вас.

+0

Да, это именно то, что он делает, следует ли использовать ReadAllLines или иметь цикл foreach или что-то еще? – user721

+0

Я согласен с @Kendall, что вы не должны использовать LINQ для синтаксического анализа. Формат файла очень близок к JSON, так что, возможно, вы могли бы просто сделать это и сэкономить себе какое-то горе. Вы __could__ используете 'ReadAllLines', и он должен работать, как я описал в своем ответе. – bluevector

Смежные вопросы