Как узнать количество строк в огромном CSV или текстовом файле на 4 ГБ и более?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Многие из нас сталкивались с задачей обработки гигантских выгрузок данных. Представьте ситуацию: у вас есть текстовый или CSV файл объемом 4 гигабайта, в котором, предположительно, содержатся десятки миллионов строк. Нам нужно просто узнать их точное количество. Мы по привычке открываем обычный Notepad++, пытаемся загрузить файл в Word или просмотреть стандартными средствами Windows, но сталкиваемся с зависаниями, ошибками нехватки оперативной памяти или откровенно неверными результатами (например, программа показывает 300 000 строк вместо реальных 88 миллионов).

Давайте разберем эту проблему подробно и рассмотрим эффективные способы ее решения. Выясним причину падений программ: стандартные редакторы пытаются загрузить весь объем файла в оперативную память (RAM). Если файл весит 4 ГБ, в распакованном виде внутри программы он может потребовать 8-12 ГБ памяти. Если памяти не хватает, программа падает. Следовательно, нам нужны методы потокового чтения, при которых данные считываются и обрабатываются последовательно, небольшими порциями или построчно.

Решение 1: Использование платформы 1С (Объект ЧтениеТекста)

Если мы работаем в экосистеме 1С, у нас есть отличные встроенные механизмы. Важно понимать разницу между объектами платформы. Многие программисты по ошибке пытаются использовать объект ТекстовыйДокумент. Однако этот объект загружает весь файл в память целиком, что неминуемо приведет к зависанию. Для нашей задачи мы применим объект ЧтениеТекста, который реализует именно потоковое чтение.

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


ИмяФайла = "C:\ПутьКФайлу\ВашФайл.csv"; 
ЧтениеТекста = Новый ЧтениеТекста(ИмяФайла); 
Сч = 0; 

Пока ЧтениеТекста.ПрочитатьСтроку() <> Неопределено Цикл 
    Сч = Сч + 1; 
КонецЦикла; 

ЧтениеТекста.Закрыть();
Сообщить("Количество строк: " + Сч);

Проанализируем этот код: метод ПрочитатьСтроку() берет из файла только одну строку за раз, мы увеличиваем счетчик и сразу же "забываем" содержимое прочитанной строки, освобождая память. На практике такой скрипт обрабатывает файл размером 4 ГБ (около 86,5 миллионов строк) примерно за 5 минут, практически не нагружая оперативную память.

Решение 2: Использование PowerShell (Ищем правильный подход)

Если под рукой нет 1С, мы можем воспользоваться встроенными средствами Windows, а именно PowerShell. Однако здесь есть коварная ловушка, в которую часто попадают разработчики.

Посмотрим на неправильный пример кода, который часто можно встретить на просторах сети:


$filePath = "C:\ПутьКФайлу\ВашФайл.csv"
$fileContent = Get-Content -Path $filePath
$lineCount = ($fileContent | Measure-Object -Line).Lines
Write-Host "Количество строк: $lineCount"

Почему этот код "повесит" ваш компьютер при файле в 4 ГБ? Командлет Get-Content по умолчанию считывает весь файл и создает отдельный объект .NET для каждой строки в оперативной памяти. Это катастрофически медленно и ресурсозатратно.

Давайте перепишем скрипт, используя потоковое чтение через классы .NET. Разберем правильный вариант с использованием объекта IO.StreamReader:


$LinesInFile = 0 
$reader = New-Object IO.StreamReader "C:\ПутьКФайлу\ВашФайл.csv" 
while($reader.ReadLine() -ne $null){ 
    $LinesInFile++ 
} 
$reader.Close()
Write-Host "Всего строк: $LinesInfile"

Или рассмотрим еще более элегантный и лаконичный метод, который работает как генератор и не перегружает память:


$count = [System.IO.File]::ReadLines("C:\ПутьКФайлу\ВашФайл.csv").Count
Write-Host "Всего строк: $count"

Решение 3: Альтернативы для командной строки Windows (CMD)

Если вы не хотите писать скрипты и предпочитаете старую добрую командную строку Windows (CMD), мы можем применить хитрость с утилитой find. Мы заставим утилиту искать строки, которые НЕ содержат пустых значений (инверсия поиска).

Посмотрим на пример команды:

type C:\Путь\ВашФайл.csv | find /v /c ""

Либо можно выполнить поиск набора символов, которого гарантированно нет в вашем файле:

find /c /v "несуществующий_набор_абвгд" C:\Путь\ВашФайл.csv

Этот способ работает медленнее, чем специально написанные скрипты или Linux-утилиты, но он всегда доступен "из коробки" в любой версии Windows.

Решение 4: Мощь утилит Linux (команда wc)

Самым быстрым, проверенным и надежным способом подсчета строк в IT-мире признана консольная утилита wc (сокращение от Word Count) из систем Linux/Unix. Она написана на языке C и оптимизирована на низком уровне. Файл на несколько гигабайт она просчитает буквально за считанные секунды.

Как нам использовать это в Windows? У нас есть несколько путей:

  1. Запустить подсистему Windows для Linux (WSL).
  2. Использовать терминал Git Bash (он устанавливается вместе с системой контроля версий Git и содержит базовые Linux-утилиты).
  3. Установить пакет утилит GnuWin32.

Команда для подсчета строк выглядит предельно просто. Мы используем ключ -l (от слова line):

wc -l ВашФайл.csv

Решение 5: Специализированные текстовые редакторы

Что делать, если нам нужно не только узнать количество строк, но и визуально просмотреть данные, найти определенные значения и убедиться в корректности структуры огромного CSV файла? Обычные блокноты здесь бессильны.

В этом случае нам на помощь приходит специализированное программное обеспечение. Безоговорочным лидером в среде Windows является редактор EmEditor. Разберем его преимущества: программа специально оптимизирована для работы с гигантскими текстовыми массивами и таблицами CSV. Она поддерживает открытие файлов размером до 248 ГБ! Программа не загружает файл в память целиком, она мгновенно открывает первые экраны текста и практически моментально подсчитывает общее количество строк в статус-баре.

Также вы можете обратить внимание на бесплатные альтернативы для просмотра больших файлов (хотя они могут уступать в скорости поиска и редактирования):

  1. glogg — отличный инструмент для исследования гигантских лог-файлов.
  2. Large Text File Viewer — минималистичная утилита исключительно для просмотра.
  3. EditPad Lite — неплохой редактор, умеющий обходить ограничения стандартного блокнота.

Решение 6: Алгоритмы Memory Mapping для экстремальных задач

Если вы дата-инженер и регулярно сталкиваетесь с файлами по 50-100 ГБ, даже потоковое чтение может занять много времени. Для максимальной скорости энтузиасты применяют утилиты, использующие технологию проецирования файла в память (memory mapping).

Проанализируем, как это работает: вместо того чтобы читать файл строка за строкой, программа логически делит массив данных на равные блоки и заставляет все доступные ядра процессора (многопоточность) параллельно искать символы переноса строки (обычно это символ \n). Утилиты вроде turbo-linecount позволяют подсчитать сотни миллионов строк в многогигабайтных базах данных за доли секунды, максимально утилизируя мощность современных NVMe-дисков и многоядерных процессоров.

Подведем итоги

Мы подробно разобрали различные способы работы с файлами огромного размера. Подведем краткий итог, чтобы вам было проще выбрать оптимальный инструмент:

  1. Работаете в конфигураторе? Используйте объект ЧтениеТекста в 1С. Это надежно и просто.
  2. Нужно быстро посчитать в Windows без установки стороннего ПО? Ваш выбор — класс System.IO.File в PowerShell.
  3. Нужна экстремальная скорость? Используйте Linux-утилиту wc -l через Git Bash или WSL.
  4. Хотите просматривать и редактировать гигантские CSV? Установите EmEditor.

Помните главное правило при работе с Big Data: никогда не пытайтесь загрузить весь объем данных в оперативную память. Всегда используйте инструменты потоковой обработки!

← На главную