Ответ 1
Попробуйте выполнить
// Skip 5 lines
for(var i = 0; i < 5; i++) {
tr.ReadLine();
}
// Read the rest
string remainingText = tr.ReadToEnd();
У меня есть программа, которая читает текстовый файл и обрабатывает его для разделения на разделы.
Итак, вопрос в том, как можно изменить программу, чтобы программа могла пропустить чтение первых 5 строк файла при использовании Stream Reader для чтения файла?
Могут ли кто-то проконсультироваться по кодам? Спасибо!
Коды:
class Program
{
static void Main(string[] args)
{
TextReader tr = new StreamReader(@"C:\Test\new.txt");
String SplitBy = "----------------------------------------";
// Skip first 5 lines of the text file?
String fullLog = tr.ReadToEnd();
String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);
//String[] lines = sections.Skip(5).ToArray();
foreach (String r in sections)
{
Console.WriteLine(r);
Console.WriteLine("============================================================");
}
}
}
Попробуйте выполнить
// Skip 5 lines
for(var i = 0; i < 5; i++) {
tr.ReadLine();
}
// Read the rest
string remainingText = tr.ReadToEnd();
Если строки фиксированы, то наиболее эффективным способом является следующее:
using( Stream stream = File.Open(fileName, FileMode.Open) )
{
stream.Seek(bytesPerLine * (myLine - 1), SeekOrigin.Begin);
using( StreamReader reader = new StreamReader(stream) )
{
string line = reader.ReadLine();
}
}
И если строки различаются по длине, вам придется просто читать их по строке в следующем порядке:
using (var sr = new StreamReader("file"))
{
for (int i = 1; i <= 5; ++i)
sr.ReadLine();
}
Если вы хотите использовать его больше раз в своей программе, то, может быть, неплохо было бы создать собственный класс, унаследованный от StreamReader, с возможностью пропускать строки.
Что-то вроде этого может сделать:
class SkippableStreamReader : StreamReader
{
public SkippableStreamReader(string path) : base(path) { }
public void SkipLines(int linecount)
{
for (int i = 0; i < linecount; i++)
{
this.ReadLine();
}
}
}
после этого вы можете использовать функцию SkippableStreamReader для пропуска строк. Пример:
SkippableStreamReader exampleReader = new SkippableStreamReader("file_to_read");
//do stuff
//and when needed
exampleReader.SkipLines(number_of_lines_to_skip);
Я добавлю еще два предложения в список.
Если всегда будет файл, и вы будете читать только, я предлагаю следующее:
var lines = File.ReadLines(@"C:\Test\new.txt").Skip(5).ToArray();
File.ReadLines не блокирует файл от других и загружает только нужные строки.
Если ваш поток может поступать из других источников, я предлагаю этот подход:
class Program
{
static void Main(string[] args)
{
//it up to you to get your stream
var stream = GetStream();
//Here is where you'll read your lines.
//Any Linq statement can be used here.
var lines = ReadLines(stream).Skip(5).ToArray();
//Go on and do whatever you want to do with your lines...
}
}
public IEnumerable<string> ReadLines(Stream stream)
{
using (var reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
yield return reader.ReadLine();
}
}
}
Блок Итератора автоматически очистится, как только вы закончите с ним. Здесь - статья Джона Скита, в которой подробно описывается, как это работает (прокрутите вниз до раздела "И наконец..." ).
Я бы предположил, что это просто:
static void Main(string[] args)
{
var tr = new StreamReader(@"C:\new.txt");
var SplitBy = "----------------------------------------";
// Skip first 5 lines of the text file?
foreach (var i in Enumerable.Range(1, 5)) tr.ReadLine();
var fullLog = tr.ReadToEnd();
String[] sections = fullLog.Split(new string[] { SplitBy }, StringSplitOptions.None);
//String[] lines = sections.Skip(5).ToArray();
foreach (String r in sections)
{
Console.WriteLine(r);
Console.WriteLine("============================================================");
}
}