перейти в строку файла c # - PullRequest
6 голосов
/ 20 января 2010

как я могу перейти на какую-нибудь строку в моем файле, например, строку 300 в c: \ text.txt?

Ответы [ 5 ]

12 голосов
/ 20 января 2010
using (var reader = new StreamReader(@"c:\test.txt"))
{
    for (int i = 0; i < 300; i++)
    {
        reader.ReadLine();
    }
    // Now you are at line 300. You may continue reading
}
9 голосов
/ 20 января 2010

Файлы с разделителями строк не предназначены для произвольного доступа. Таким образом, вы должны искать файл, читая и отбрасывая необходимое количество строк.

Современный подход:

class LineReader : IEnumerable<string>, IDisposable {
        TextReader _reader;
        public LineReader(TextReader reader) {
            _reader = reader;
        }

        public IEnumerator<string> GetEnumerator() {
            string line;
            while ((line = _reader.ReadLine()) != null) {
                yield return line;
            }
        }

        IEnumerator IEnumerable.GetEnumerator() {
            return GetEnumerator();
        }

        public void Dispose() {
            _reader.Dispose();
        }
    }

Использование:

// path is string
int skip = 300;
StreamReader sr = new StreamReader(path);
using (var lineReader = new LineReader(sr)) {
    IEnumerable<string> lines = lineReader.Skip(skip);
    foreach (string line in lines) {
        Console.WriteLine(line);
    }
}

Простой подход:

string path;
int count = 0;
int skip = 300;
using (StreamReader sr = new StreamReader(path)) {
     while ((count < skip) && (sr.ReadLine() != null)) {
         count++;
     }
     if(!sr.EndOfStream)
         Console.WriteLine(sr.ReadLine());
     }
}
1 голос
/ 20 января 2010

Я заметил пару вещей:

  1. Пример использования Microsoft StreamReader конструктор проверок существует ли файл первым.

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

Так что это комбинация нескольких других ответов.

string path = @"C:\test.txt";
int count = 0;

if(File.Exists(path))
{
  using (var reader = new StreamReader(@"c:\test.txt"))
  {
    while (count < 300 && reader.ReadLine() != null)
    {
      count++;
    }

    if(count != 300)
    {
      Console.WriteLine("There are less than 300 lines in this file.");
    }
    else
    {
      // keep processing
    }
  }
}
else
{
  Console.WriteLine("File '" + path + "' does not exist.");
}
1 голос
/ 20 января 2010
Dim arrText() As String 
Dim lineThreeHundred As String

arrText = File.ReadAllLines("c:\test.txt") 

lineThreeHundred = arrText(299) 

Редактировать: C # версия

string[] arrText;
string lineThreeHundred;

arrText = File.ReadAllLines("c:\test.txt");
lineThreeHundred = arrText[299];
0 голосов
/ 20 января 2010
/// <summary>
/// Gets the specified line from a text file.
/// </summary>
/// <param name="lineNumber">The number of the line to return.</param>
/// <param name="path">Identifies the text file that is to be read.</param>
/// <returns>The specified line, is it exists, or an empty string otherwise.</returns>
/// <exception cref="ArgumentException">The line number is negative, or the path is missing.</exception>
/// <exception cref="System.IO.IOException">The file could not be read.</exception>
public static string GetNthLineFromTextFile(int lineNumber, string path)
{
    if (lineNumber < 0)
        throw new ArgumentException(string.Format("Invalid line number \"{0}\". Must be greater than zero.", lineNumber));
    if (string.IsNullOrEmpty(path))
        throw new ArgumentException("No path was specified.");

    using (System.IO.StreamReader reader = new System.IO.StreamReader(path))
    {
        for (int currentLineNumber = 0; currentLineNumber < lineNumber; currentLineNumber++)
        {
            if (reader.EndOfStream)
                return string.Empty;
            reader.ReadLine();
        }
        return reader.ReadLine();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...