Самый эффективный способ сделать это - воспользоваться отложенным выполнением в LINQ. Вы можете создать простую функцию Linq-To-Text, которая будет читать по одной строке за раз, работать над ней и затем продолжать. Это действительно полезно, так как файл очень большой.
Я бы воздержался от использования методов ReadBlock или ReadBlock или ReadToEnd класса StreamReader, поскольку они, как правило, читают сразу несколько строк или даже целые строки в файле. Это в итоге потребляет больше памяти, чем если бы строка читалась по одному за раз.
public static IEnumerable<string> Lines(this StreamReader source)
{
String line;
if (source == null)
throw new ArgumentNullException("source");
while ((line = source.ReadLine()) != null)
{
yield return line;
}
}
Обратите внимание, что функция является методом расширения класса StreamReader. Это означает, что его можно использовать следующим образом:
class Program
{
static void Main(string[] args)
{
using(StreamReader streamReader = new StreamReader("TextFile.txt"))
{
var tokens = from line in streamReader.Lines()
let items = line.Split(',')
select String.Format("{0}{1}{2}",
items[1].PadRight(16),
items[2].PadRight(16),
items[3].PadRight(16));
}
}
}