Как узнать количество строк в файле c
Перейти к содержимому

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

  • автор:

Узнать количество строк в текстовом файле

Но этот способ занимает много времени и забивает оперативную память, при загрузке текстовых файлов размером более 1 гигабайта, это не актуально.

Отслеживать
задан 19 авг 2018 в 7:08
35 1 1 серебряный знак 10 10 бронзовых знаков

Воспользуйтесь ReadLines или если хотите тратить прямо минимум ресурсов, то чтение с буфером, чтение больших файлов — с этим можно просто посчитать количество переносов строки в файле

19 авг 2018 в 9:14

int count = System.IO.File.ReadAllLines(path_base).Count(); используя System.Linq, но тут нужно учитывать, что для 32 битных систем максимум файл в 4Gb, лучше использовать вариант из ответа ниже

19 авг 2018 в 17:17

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Пример с буфером в 10 мегабайт.

var linesCount = 1; int nextLine = '\n'; using (var streamReader = new StreamReader( new BufferedStream( File.OpenRead(@"D:\temp\11.xml"), 10 * 1024 * 1024))) // буфер в 10 мегабайт < while(!streamReader.EndOfStream) < if (streamReader.Read() == nextLine) linesCount++; >> Console.WriteLine(linesCount); 

Отслеживать
ответ дан 19 авг 2018 в 16:29
32.8k 2 2 золотых знака 30 30 серебряных знаков 75 75 бронзовых знаков
вместо ‘\n’ лучше использовать Enviroment.NewLine
19 авг 2018 в 17:19

@B.Vandyshev Enviroment.NewLine — это строка, а не символ. Я не могу сравнивать при чтении строку и символ. К тому же в винде это \r\n , в линуксе \n , то есть \n присутствует в любом случае, не зависимо от того, с каким окончанием строк сохранен файл.

19 авг 2018 в 17:22
@tym32167, а в маке вроде \r ?
19 авг 2018 в 17:25
@Grundy про мак к сожалению не знаю
19 авг 2018 в 17:26
@Grundy ну и здорово, значит ответ править не придется 🙂
19 авг 2018 в 17:29

 int count = 0; string line; TextReader reader = new StreamReader(path_base); while ((line = reader.ReadLine()) != null) < count++; >reader.Close(); 

Отслеживать
ответ дан 19 авг 2018 в 7:17
35 1 1 серебряный знак 10 10 бронзовых знаков

File.ReadLines(path).Count() — является эквивалентом вашего кода. Метод ReadLines не читает весь файл сразу, в отличие от ReadAllLines .

19 авг 2018 в 7:41

А если файл большой (гигабайты) и состоит из одной-единственной строки? Облом. Если нужно решение, работающее на любых входных данных, то нужно читать файл блоками и искать в них символы конца строки.

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

Подскажите, пожалуйста, как можно посчитать количество строк в текстовом файле?
Вот как я делаю:
Код:
while (!feof(read)) // если не конец – едем дальше
fgets(s, 150,read);
count++; //считаю строку
>;

Но есть большое НО – функция fgets заканчивает считывать строку только когда в конце есть ‘\n’, а этот символ стоит далеко не всегда(например, Когда в любом текстовом редакторе набираешь текст, то он при автопереносе на новую строку символ ‘\n’ не ставит) а без него этот алгоритм бесполезен
Подскажите, как сделать правильно

Re: Как посчитать строки в файле?

От: Lucker http://lucker.intervelopers.com/
Дата: 20.04.03 05:47
Оценка:

Здравствуйте, Froland, Вы писали:

F>Но есть большое НО – функция fgets заканчивает считывать строку только когда в конце есть ‘\n’, а этот символ стоит далеко не всегда(например, Когда в любом текстовом редакторе набираешь текст, то он при автопереносе на новую строку символ ‘\n’ не ставит) а без него этот алгоритм бесполезен

Это НО совсем не большое. То что редактор переносит текст не влазящий в определенную длину строки на новую строку называется word-wrap и влияет это только на отображение строки в этом редакторе (практически везде можно отключить автоперенос строк (и тогда ты увидишь то что у тебя реально в файле) или же изменить количество символов, после которых у тебя осуществляется автоперенос).
Ищи алгоритм WORD-WRAPера

Re: Как посчитать строки в файле?

От: Kaa http://blog.meta.ua/users/kaa/
Дата: 20.04.03 14:33
Оценка:

Здравствуйте, Froland, Вы писали:

Вот один из способов подсчета количества строк:

#include #include #include int CountStrings( std::istream& is ) < if ( ! is.good() ) return 0; std::string s; int nStrings = 0; while ( std::getline( is, s ) ) ++nStrings; return nStrings; > int CountStrings( const char* name ) < std::fstream is; is.open( name, std::ios_base::in ); return is.good() ? CountStrings( is ) : 0; > int main( int argc, char* argv[] ) < using namespace std; for ( int i = 1; i < argc; ++i ) cout "Count of strings in " << argv[i] " equals " return 0; >

Алексей Кирдин
Re: Как посчитать строки в файле?

От: Юнусов Булат
Дата: 20.04.03 15:50
Оценка: 48 (6)

Здравствуйте, Froland, Вы писали:

gcc3.2.2
vc6 vc7 (не STLPort)

#include "stdafx.h" #include #include #include int main(int argc, char * argv[]) < std::ifstream ar("stdafx.h", std::ios::in|std::ios::binary); std::istreambuf_iteratorchar> begin(ar), end; std::cout char('\n') ) return 0; >

Re: Как посчитать строки в файле?

От: menify
Дата: 21.04.03 00:33
Оценка:

Здравствуйте, Froland, Вы писали:

F>Но есть большое НО – функция fgets заканчивает считывать строку только когда в конце есть ‘\n’, а этот символ стоит далеко не всегда(например, Когда в любом текстовом редакторе набираешь текст, то он при автопереносе на новую строку символ ‘\n’ не ставит) а без него этот алгоритм бесполезен

F>Подскажите, как сделать правильно
Незабывай, что бывают разные форматы переноса строки в текстовых файлах:

  • CR+LF — Windows
  • LF — UNIX
  • CR — MAC

Узнать количество строк в файле Linux

Довольно частенько нужно подсчитать количество файлов при выводе в консоли BASH. Хорошо если файлов 10 единиц. Как быть если их сотни и у каждого файла сложное имя. Тут идеально подойдёт команда wc. Её наилучше использовать вместе с фильтром. Например с командой grep команда wc хорошо сочетается. Возможно подсчитать количество слов в документе.

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

Подсчет строк, слов и знаков с помощью wc

Система отвечает строкой в следующем формате: l w c файл

Читайте также: Создатель Linux — Linus Torvalds

где l — число строчек в файле;
w — число слов в файле;
c — число символов в файле.

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

Система говорит следующим образом:

l w c файл1
l w c файл2
l w c total

Число строк, слов и символов для файл1 и файл2 отражается на отдельных строках. На последней строке отображается общее число строк, слов и знаков в двух файлах.

Подсчет данных в документе

wc text.txt
вывод: 40 149 947 text.txt

В первоначальной колонке содержится количество строк, во второй кол-во слов, в третьей кол-во знаков

wc -l file.txt #вывести количество строк (ряд знаков, написанных или напечатанных в одну линию)
wc -c file.txt #вывести количество байт
wc -m file.txt #вывести число символов
wc -L file.txt #вывести длину самой длинной строки
wc -w file.txt #вывести число слов

Подсчёт данных в выводе командной строки Linux

ls -al | grep ‘.txt’ | wc -l

Читайте также: Установка приоритетов для процессов в Linux

ls -al | grep ‘.txt’ | wc -w

Подсчет количества .txt-файлов в текущем каталоге с помощью wc:

При выводе в инструктивной строке очень часто попадают файлы с точками вместо имён .. или . .Тут необходимо отфильтровать вывод и только потом применять команду wc. Как подсчитать количество файлов в папки. Тут добавлена сортировка и удаление дублей. uniq — убирает дубли, перед unic обязана идти сортировка sort

Поиск количества файлов в директории Linux

ls | grep «name» | sort | uniq | wc -l

Подсчет уникальных строк и дубликатов в текстовом файле Linux

Буквально сегодня на работе столкнулся с довольно простой задачей, состоящей из двух подзадач: 1) нужно было подсчитать в текстовом файле количество уникальных строк 2) подсчитать в уже другом файле количество строчек, которые дублируются.

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

Читайте также: Заескейпить активные метасимволы в Linux

$ sort data.txt | uniq -u | wc -l

Всё достаточно просто. Утилита uniq с функцией -u выводит на экран уникальные строки (u—unique, видимо так) и с помощью | результат перенаправляется в утилиту wc , какая просто считает количество строк, т.к. исполняется с опцией -l. В самом начале нам необходимо просортировать входной поток данных (текстовый файл), иначе утилита uniq не сможет правильно подсчитать уникальные строки. Выполняется сортировка с помощью sort и результат, используя |, перенаправляется в uniq. После исполнения такой команды для файла data.txt на экран будет выведено число 5.

Для этого чтобы решить вторую подзадачу, сделаем всё тоже самое, только uniq станет выполнен с опцией -d (видимо d—duplicate):

$ sort data.txt | uniq -d | wc -l

В результате на экран выведено количество 2. Обе подзадачи решены достаточно простым способом. Записал небольшую демонстрацию кому забавно.

Подсчитать количество строк в файле Linux

Нет ничего проще, чем подсчитать количество строчек в файле.

cat filename.txt | wc -l

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

Подсчёт количества строк в текстовом файле

Во многих редакторах при работе с текстовым документом вы можете видеть, сколько всего строк содержится в этом файле. Строки между собой разделяются символом перевода строки, который в каждой операционной системе (Windows, Unix, Mac) свой.

Давайте разберёмся, как быстро подсчитать количество строк в текстовом файле независимо от той ОС, в котором выполняется наш код. Более того, текстовый файл может быть сколь угодно большим, поэтому мы будем использовать буферизацию потока, чтобы не израсходовать всю доступную оперативную память.

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

Вариант c LineNumberReader

public static long getLineCountByReader(String fileName) throws IOException <
try ( var lnr = new LineNumberReader( new FileReader(fileName))) <
while (lnr.readLine() != null ) ;
return lnr.getLineNumber();
>
>

Сначала мы в конструкции try-with-resources последовательно создаём два Reader’a, оборачивая один в другой:

  1. FileReader – для работы с файлом.
  2. LineNumberReader – собственно, для подсчёта количества строк.

Буферизация потока здесь в явном виде не требуется, т.к. LineNumberReader уже наследуется от BufferedReader.

Все перечисленные ридеры поддерживают интерфейс AutoCloseable и конструкция try-with-resources гарантирует нам, что после выхода из этого блока они все будут закрыты.

Затем в цикле вызываем у LineNumberReader метод readLine(). Поскольку никаких дополнительных действий нам делать не надо, то тело цикла будет пустым. После выхода из цикла метод getLineNumber() возвращает нам количество строк в файле.

На мой взгляд, это наиболее «читаемая» реализация, но ниже мы рассмотрим чуть более быструю версию. А пока можем вызвать наш метод:

public static void main(String[] args) throws IOException <
System.out.println( «Lines count: » + getLineCountByReader( «/home/user/very-large-file.txt» ));
>

Даже для текстового файла на десятки мегабайт подсчёт количества строк занимает меньше секунды.

Вариант c инкрементом

Наш метод можно немного ускорить, отказавшись от LineNumberReader. Вместо этого будем подсчитывать строки с помощью обычного инкремента.

public static long getLineCountByIncrement(String fileName) throws IOException <
var lines = 0L ;
try ( var reader = new BufferedReader( new FileReader(fileName))) <
while (reader.readLine() != null ) <
lines++;
>
return lines;
>
>

Здесь мы точно так же в блоке try создаём FileReader и BufferedReader, чтобы по окончании они были гарантированно закрыты. После этого в цикле на каждой итерации также вызываем метод readLine(). На этот раз тело цикла у нас не пустое, в нём мы увеличиваем переменную lines на 1. Такая реализация быстрее предыдущей примерно на 10%.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *