разбирать строки используя linq to txt - PullRequest
1 голос
/ 02 февраля 2010
var t1 = from line in File.ReadAllLines(@"alkahf.txt")
                     let item = line.Split(new string[] {". "}, StringSplitOptions.RemoveEmptyEntries)
                     let verse = line.Split(new string[] { "\n. " }, StringSplitOptions.RemoveEmptyEntries)
                     select new
                     {
                         Index = item,
                         Text = verse
                     };

возникли проблемы с кодом выше, я не уверен, как правильно разобрать строки.

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

1. This is text it might have numbers

2. I skipped a line

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

В части LINQ вы находитесь внутри одной строки, поэтому вы можете сначала исключить пустые строки:

from line in File.ReadAllLines(@"alkahf.txt")
where !string.IsNullOrEmpty(line)

Затем вы делаете два разбиения - одно на новой строке, что странно (поскольку этого не будет, поскольку мы знаем, что читаем строки). Я ожидаю Вы имеете в виду что-то вроде:

let parts = line.Split('.')
where parts.Length == 2
select new {
    Index = parts[0],
    Text = parts[1]
};

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

public static IEnumerable<string> ReadLines(string path) {
    using(var reader = File.OpenText(path)) {
        string line;
        while((line = reader.ReadLine()) != null) {
            yield return line;
        }
    }
}

без буферизации (вы не загружаете весь файл сразу). Просто измените первую строку на:

from line in ReadLines(@"alkahf.txt")
0 голосов
/ 04 февраля 2010

Благодаря Марк ответил Я исправил свою проблему. Извините за поздний ответ, я работаю над этим как с личным проектом.

Код похож на

 var t1 = from line in StreamReaderExtension.ReadLinesFromFile(@"alkahf.txt")
          let parts = line.Split(new string[]{". "}, 
              StringSplitOptions.RemoveEmptyEntries)
          where !string.IsNullOrEmpty(line)                     
              && int.Parse(parts[0].ToString()).ToString() != ""
          select new
          {
              Index = parts[0],
              Text = parts[1]
          };

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

...