Парсинг TXT: построчное чтение, регулярные выражения и примеры на разных языках

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

КP
Команда Parsing.agency
Сбор данных под задачи бизнеса
Опубликовано: 15 апреля 2025

Текстовый файл (.txt) — самый «свободный» формат: у него нет схемы, грамматики и стандарта. Что внутри — целиком решает тот, кто файл создал. Это может быть простой список, экспорт данных с фиксированной шириной колонок, выгрузка с нестандартным разделителем или вообще сплошной текст. Поэтому парсинг TXT — это не про библиотеку под формат, а про умение разобрать произвольную структуру вручную. Статья входит в наш обзор парсинга документов.

Сначала определите, что внутри

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

Отдельно стоит проверить кодировку (русский текст часто бывает в windows-1251) и символ перевода строки — в файлах из Windows это \r\n, в Unix \n. Большинство языков читают строки корректно в обоих случаях, но «хвостовой» \r иногда приходится убирать вручную.

Построчное чтение

Python

Файл — это итератор по строкам, поэтому читать его построчно естественно и экономно по памяти даже для гигабайтных файлов.

python
with open("data.txt", encoding="utf-8") as f:
    for line in f:
        line = line.strip()          # убираем пробелы и перевод строки
        if not line:                 # пропускаем пустые строки
            continue
        print(line)

JavaScript / Node.js

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

javascript
const fs = require("fs");
const readline = require("readline");

const rl = readline.createInterface({
  input: fs.createReadStream("data.txt", "utf-8"),
});

rl.on("line", (line) => {
  const clean = line.trim();
  if (clean) console.log(clean);
});

Go

go
package main

import (
    "bufio"
    "fmt"
    "os"
    "strings"
)

func main() {
    f, _ := os.Open("data.txt")
    defer f.Close()

    sc := bufio.NewScanner(f)
    for sc.Scan() {
        line := strings.TrimSpace(sc.Text())
        if line != "" {
            fmt.Println(line)
        }
    }
}

Извлечение данных регулярными выражениями

Когда нужные значения «зашиты» в текст, их достают по шаблону. Допустим, в файле строки вида [2026-06-01] Заказ #1042: 3490 руб. и нужно вытащить дату, номер заказа и сумму.

python
import re

pattern = re.compile(r"\[(\d{4}-\d{2}-\d{2})\] Заказ #(\d+): (\d+) руб")

with open("orders.txt", encoding="utf-8") as f:
    for line in f:
        m = pattern.search(line)
        if m:
            date, order_id, amount = m.groups()
            print(date, order_id, amount)

Тот же подход на JavaScript:

javascript
const re = /\[(\d{4}-\d{2}-\d{2})\] Заказ #(\d+): (\d+) руб/;
const m = line.match(re);
if (m) {
  const [, date, orderId, amount] = m;
  console.log(date, orderId, amount);
}

Регулярные выражения — главный инструмент при разборе неструктурированного текста, и стоит держать под рукой какой-нибудь интерактивный тестер (например, regex101), чтобы отлаживать шаблон на реальных строках. Важно помнить про их границы: регулярками не разбирают вложенные форматы вроде XML или HTML — там нужны полноценные парсеры. А вот для плоского текста по строкам это идеальный выбор.

Данные с фиксированной шириной колонок

Старые системы и выгрузки из мейнфреймов часто отдают текст, где колонки заданы не разделителем, а позицией символов: первые 10 символов — артикул, следующие 30 — название, и так далее. Такой формат разбирают срезами строки по фиксированным индексам.

python
with open("fixed.txt", encoding="utf-8") as f:
    for line in f:
        sku   = line[0:10].strip()
        name  = line[10:40].strip()
        price = line[40:50].strip()
        print(sku, name, price)

Частный, но очень важный случай — логи

Самый распространённый вид TXT-файлов, который приходится разбирать на практике, — это журналы серверов и приложений. У логов хоть и нет общего стандарта, но в пределах одного источника формат строки стабилен, что позволяет применять к ним те же приёмы — построчное чтение плюс регулярные выражения — но с рядом своих нюансов: многострочные записи, ротация, объёмы в гигабайты. Этому посвящена отдельная статья про парсинг логов.

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