Определите количество строк в текстовом файле

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
196
задан H.B. 23 November 2011 в 15:42
поделиться

7 ответов

Серьезно задержанное редактирование: при использовании.NET 4.0 или позже

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

var lineCount = File.ReadLines(@"C:\file.txt").Count();
<час>

Исходный Ответ

, Если Вы не слишком побеспокоены об эффективности, можно просто записать:

var lineCount = File.ReadAllLines(@"C:\file.txt").Length;

Для более эффективного метода Вы могли сделать:

var lineCount = 0;
using (var reader = File.OpenText(@"C:\file.txt"))
{
    while (reader.ReadLine() != null)
    {
        lineCount++;
    }
}

Редактирование: В ответ на вопросы об эффективности

причина я сказал, что второе было более эффективным, расценивал использование памяти, не обязательно скорость. Первый загружает все содержание файла в массив, что означает, что это должно выделить, по крайней мере, столько же памяти сколько размер файла. Второе просто циклично выполняет одну строку за один раз, таким образом, она никогда не должна выделять ценность больше чем одной строки памяти за один раз. Это не настолько важно для маленьких файлов, но для больших файлов это могла быть проблема (при попытке найти количество строк в файле на 4 ГБ в 32-разрядной системе, например, где просто нет достаточного адресного пространства непривилегированного режима для выделения массива это большое).

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

380
ответ дан Dante May Code 23 November 2019 в 05:18
поделиться

Самое легкое:

int lines = File.ReadAllLines("myfile").Length;
12
ответ дан leppie 23 November 2019 в 05:18
поделиться

Это использовало бы меньше памяти, но вероятно взяло бы дольше

int count = 0;
string line;
TextReader reader = new StreamReader("file.txt");
while ((line = reader.ReadLine()) != null)
{
  count++;
}
reader.Close();
8
ответ дан benPearce 23 November 2019 в 05:18
поделиться

Если легким Вы имеете в виду строки кода, которые легко дешифровать, но на неэффективный шанс?

string[] lines = System.IO.File.RealAllLines($filename);
int cnt = lines.Count();

Это - вероятно, самый быстрый способ знать сколько строк.

Вы могли также сделать (в зависимости от того, если Вы буферизуете его в)

#for large files
while (...reads into buffer){
string[] lines = Regex.Split(buffer,System.Enviorment.NewLine);
}

существуют другие многочисленные пути, но одно из вышеупомянутого, вероятно, с чем Вы пойдете.

5
ответ дан Jason Plank 23 November 2019 в 05:18
поделиться

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

2
ответ дан Mitchel Sellers 23 November 2019 в 05:18
поделиться

считайте возвраты/переводы строки каретки. Я верю в unicode, который они все еще 0x000D и 0x000A соответственно. тем путем можно быть столь эффективными или неэффективными, как Вы хотите и решаете, необходимо ли иметь дело с обоими символами или не

1
ответ дан geocoin 23 November 2019 в 05:18
поделиться

Можно запуститься" туалет .exe" исполняемый файл (идет UnixUtils и не нуждается в установке), выполненный как внешний процесс. Это поддерживает различные методы счета строки (как Unix по сравнению с Mac по сравнению с окнами).

-2
ответ дан Sklivvz 23 November 2019 в 05:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: