Как прочитать указанную строку в текстовом файле? - PullRequest
52 голосов
/ 12 августа 2009

Учитывая текстовый файл, как бы я прочитал произвольную строку и ничего больше в файле?

Скажем, у меня есть файл test.txt.Как бы я прочитал строку номер 15 в файле?

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

Есть ли способы ТОЛЬКО прочитать определенную строку текстового файла и сохранить результат в виде строки?

Спасибо за ваши ответы: Файл структурирован KINDA.У него 25 информационных строк, а затем X строк чисел, но строка 17 из первых 25 имеет значение X .

Но тогда есть 1 пустая строкаи он повторяется как вторая запись в файле, и X может иметь различное значение для каждой записи.

Я хочу прочитать и сохранить первые 25 строк какнезависимые значения и затем сохраните следующие X (обычно около 250) строк в виде массива.Затем я собираюсь сохранить его в базе данных SQL и повторять с NEXT-записью, пока не достигну Y -ой записи (количество записей в файле находится в строке 3)

РЕДАКТИРОВАТЬ 2 : Хорошо, я думаю, что я нашел решение, основанное на комбинации ваших ответов.

Я прочитаю первые 25 строк и сохраню их какмассив.Я скопирую соответствующее содержимое массива в локальные переменные, затем удалю первые 25 строк.Затем я могу использовать эту информацию, чтобы сохранить следующие X строки (значение элемента 13 в массиве) в виде массива, сериализовать его, сохранить в базе данных, а затем удалить только что прочитанные строки.

Я мог бы затем повторить процесс для каждой последующей записи.

Конечно, это основано на одном предположении, которое я делаю, что, честно говоря, я не уверен, что это правда.Можно ли удалить первые n строк из текстового файла изнутри C # без необходимости читать всю вещь и переписывать ее без первых n строк?

Ответы [ 14 ]

0 голосов
/ 22 октября 2012

Хотя вы не можете искать N-ю строку непосредственно в несимметричном файле без чтения данных в файле (потому что вам нужно посчитать, сколько строк вы ввели в файл), вы можете считать разрывы строк до доберитесь до нужной вам линии, которая занимает наименьшее количество памяти и, вероятно, имеет лучшую производительность.

Это будет более эффективным с точки зрения памяти, чем чтение всего в массив, так как он будет считывать данные только до конца файла или номера строки (в зависимости от того, что произойдет раньше). Это далеко от совершенства, но, вероятно, подойдет вашим потребностям:

string line15 = ReadLine(@"C:\File.csv", 15);

public string ReadLine(string FilePath, int LineNumber){
    string result = "";
    try{
    if( File.Exists(FilePath) ){
        using (StreamReader _StreamReader = new StreamReader(FilePath)){
        for (int a = 0; a < LineNumber; a++) {
            result = _StreamReader.ReadLine();
        }
        }
    }
    }catch{}
    return result;
}
0 голосов
/ 17 октября 2011

Поздний ответ, но оно того стоит.

Вам необходимо загрузить строки в массиве или объекте списка, где каждой строке будет присвоен индекс, а затем просто вызвать любой диапазон строк по их индексу в цикле for.

Решение довольно хорошее, но между ними есть потребление памяти.

попробуй ... Оно того стоит

0 голосов
/ 19 сентября 2009

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

Если вы добавляете в файл новые строки, вы можете просто добавить индекс новых строк, и вам не нужно переиндексировать все это. Хотя, если ваш файл изменяется где-то в строке, которую вы уже проиндексировали, вам придется переиндексировать.

0 голосов
/ 12 августа 2009

Вы можете читать построчно, чтобы вам не приходилось читать все сразу (возможно, вообще)

int i=0
while(!stream.eof() && i!=lineNum)
    stream.readLine()
    i++
line = stream.readLine()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...