Пословное чтение текстового файла с использованием LINQ - PullRequest
3 голосов
/ 14 октября 2010

Я изучаю LINQ и хочу слово за словом читать текстовый файл (скажем, электронную книгу), используя LINQ.

Вот что я мог придумать:

static void Main()
        {
            string[] content = File.ReadAllLines("text.txt");

            var query = (from c in content
                         select content);

            foreach (var line in content)
            {
                Console.Write(line+"\n");
            }

        }

Это читает файл построчно. Если я изменю ReadAllLines на ReadAllText, файл будет читаться буква за буквой.

Есть идеи?

Ответы [ 6 ]

3 голосов
/ 14 октября 2010
string[] content = File.ReadAllLines("text.txt");
var words=content.SelectMany(line=>line.Split(' ', StringSplitOptions.RemoveEmptyEntries));
foreach(string word in words)
{
}

Вам нужно будет добавить любые пробельные символы, которые вам нужны. Использование StringSplitOptions для обработки последовательных пробелов является более чистым, чем предложение Where, которое я первоначально использовал.

В .net 4 вы можете использовать File.ReadLines для отложенной оценки и, таким образом, снизить использование ОЗУ при работе с большими файлами.

1 голос
/ 14 октября 2010
string str = File.ReadAllText();
char[] separators = { '\n', ',', '.', ' ', '"', ' ' };    // add your own
var words = str.Split(separators, StringSplitOptions.RemoveEmptyEntries);
0 голосов
/ 31 декабря 2012

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

static IEnumerable<string> GetWords(string path){  

    foreach (var line in File.ReadLines(path)){
        foreach (var word in line.Split(null)){
            yield return word;
        }
    }
}

( Разделение (ноль) автоматически удаляет пробел )

Использованиеэто примерно так:

foreach (var word in GetWords(@"text.txt")){
    Console.WriteLine(word);
}

Работает и со стандартными функциями Linq:

GetWords(@"text.txt").Take(25);
GetWords(@"text.txt").Where(w => w.Length > 3)

Конечно, обработка ошибок и т. д. оставлена ​​для изучения.

0 голосов
/ 14 октября 2010

Вероятно, лучше прочитать весь текст с помощью ReadAllText (), а затем использовать регулярные выражения для получения слов. Использование символа пробела в качестве разделителя может вызвать некоторые проблемы, так как он также возвращает пунктуацию (запятые, точки и т. Д.) Например:

Regex re = new Regex("[a-zA-Z0-9_-]+", RegexOptions.Compiled); // You'll need to change the RE to fit your needs
Match m = re.Match(text);
while (m.Success)
{
    string word = m.Groups[1].Value;

    // do your processing here

    m = m.NextMatch();
}
0 голосов
/ 14 октября 2010
string content = File.ReadAllText("Text.txt");

var words = from word in content.Split(WhiteSpace, StringSplitOptions.RemoveEmptyEntries) 

select word;

Вам необходимо определить массив символов пробела с вашими собственными значениями, например:

List<char> WhiteSpace = { Environment.NewLine, ' ' , '\t'};

В этом коде предполагается, что знак препинания является частью слова (например, запятой).

0 голосов
/ 14 октября 2010

Вы могли бы написать content.ToList().ForEach(p => p.Split(' ').ToList().ForEach(Console.WriteLine)), но это не так много linq.

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