Подтвердить что ты не робот

Как читать указанную строку в текстовом файле?

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

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

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

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

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

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

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

EDIT 2: Хорошо, я думаю, что я пришел к решению, основанному на сочетании ответов ваших ответов.

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

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

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

4b9b3361

Ответ 1

Редактирование .NET 4.0

Начиная с .NET 4.0, можно напрямую обращаться к одной строке файла. Например, для доступа к строке 15:

string line = File.ReadLines(FileName).Skip(14).Take(1).First();

Это вернет только требуемую строку


Поскольку вы не можете предсказать местоположение (вы можете?) i-й строки в файле, вам также придется прочитать все предыдущие строки. Если номер строки мал, это может быть более эффективным, чем метод ReadAllLines.

string GetLine(string fileName, int line)
{
   using (var sr = new StreamReader(fileName)) {
       for (int i = 1; i < line; i++)
          sr.ReadLine();
       return sr.ReadLine();
   }
}

Ответ 2

Если каждая строка имеет фиксированную длину, вы можете открыть поток вокруг него, искать (байты на строку) * n в файл и читать свою строку оттуда.

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();
    }
}

В качестве альтернативы вы можете просто использовать StreamReader для чтения строк, пока не найдете тот, который вам нужен. Таким образом, медленнее, но все же улучшается чтение каждой отдельной строки.

using( Stream stream = File.Open(fileName, FileMode.Open) )
{
    using( StreamReader reader = new StreamReader(fileStream) )
    {
        string line = null;
        for( int i = 0; i < myLineNumber; ++i )
        {
            line = reader.ReadLine();
        }
    }
}

Ответ 3

Нет, к сожалению, нет. На исходном уровне файлы не работают на основе номера строки. Вместо этого они работают в позиции/смещении. Корневая файловая система не имеет понятия линий. Это концепция, добавленная компонентами более высокого уровня.

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

Ответ 4

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

Edit:

Как уже упоминалось, можно было бы искать в файле, если длина строк была бы предсказуемой, т.е. можно было бы применить некоторую детерминированную функцию для преобразования номера строки в позицию файла.

Ответ 5

Как сказал Мехрдад, вы не можете просто искать n-ю строку, не читая файл. Однако вам не нужно хранить весь файл в памяти - просто отбросьте данные, которые вам не нужны.

string line;
using (StreamReader sr = new StreamReader(path))
    for (int i = 0; i<15; i++)
    {
       line = sr.ReadLine();
       if (line==null) break; // there are less than 15 lines in the file
    }

Ответ 6

Читайте пять строк каждый раз, просто вставьте свое утверждение в утверждение if, вот и все

        String str1 = @"C:\Users\TEMP\Desktop\StaN.txt";   

        System.IO.StreamReader file = new System.IO.StreamReader(str1);

        line = file.ReadLine();

        Int32 ctn=0;

        try
        {

            while ((line = file.ReadLine()) != null)
            {

                    if (Counter == ctn)
                    {
                        MessageBox.Show("I am here");
                        ctn=ctn+5;
                        continue;
                    }
                    else
                    {
                        Counter++;
                        //MessageBox.Show(Counter.ToString());
                        MessageBox.Show(line.ToString());
                    } 
                }

            file.Close();
        }
        catch (Exception er)
        {

        }

Ответ 7

Если строки имеют фиксированную длину, вы можете использовать метод Seek для потока, чтобы перейти к правильной стартовой позиции.

Если строки имеют переменную длину, ваши параметры более ограничены.

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

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

Ответ 8

Вы можете читать строки за строкой, поэтому вам не нужно читать все сразу (возможно, вообще)

int i=0
while(!stream.eof() && i!=lineNum)
    stream.readLine()
    i++
line = stream.readLine()

Ответ 9

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

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

Ответ 10

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

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

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;
}

Ответ 11

Пробовал и тестировал. Это так просто:

string line = File.ReadLines(filePath).ElementAt(actualLineNumber - 1);

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

Ответ 12

Вариация Выдает ошибку, если номер строки больше, чем количество строк.

string GetLine(string fileName, int lineNum)
{
    using (StreamReader sr = new StreamReader(fileName))
    {
        string line;
        int count = 1;
        while ((line = sr.ReadLine()) != null)
        {
            if(count == lineNum)
            {
                return line;
            }
            count++;
        }
    }
    return "line number is bigger than number of lines";  
}

Ответ 13

        if (File.Exists(fpath))
        {

            var data = File.ReadLines(fpath);
            Console.WriteLine(data.ToArray()[14]);
        }

Ответ 14

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

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

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

попробуй... Его стоит