Очистка CSV с помощью нейросети: правила, журнал изменений и сверка

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

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

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

Почему «Москва», «москва» и « Москва » — разные значения

CSV — простой текстовый формат: одна запись на строку, поля через запятую. Его общепринятое описание дано в RFC 4180. Из него стоит запомнить несколько правил, на которых строится вся очистка:

  • пробелы считаются частью поля, и их не нужно игнорировать: значение « Москва » с пробелами по формату отличается от «Москва»;
  • поле, где есть запятая, перевод строки или двойная кавычка, заключают в двойные кавычки, а саму кавычку внутри поля удваивают;
  • у всех записей должно быть одинаковое число полей;
  • первая строка может быть заголовком, но формат сам не говорит, заголовок это или данные, поэтому об этом договариваются отдельно.

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

Учебная выгрузка

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

код,город,количество
0017,Москва,2
0018,москва,
0017,Москва,2
0019,"Москва, Тверская",3
0020, Москва ,1

Что здесь видно человеку, но не обязательно видно программе:

  • код 0017 встречается дважды с одинаковыми данными: возможный дубль;
  • «москва» с маленькой буквы, а в строке 0020 пробелы вокруг названия;
  • у кода 0018 количество пустое — это «неизвестно», а не ноль;
  • в 0019 запятая внутри названия защищена кавычками, это корректно, трогать структуру не нужно.

Ещё одна неочевидная опасность: некоторые табличные редакторы при открытии файла могут превратить 0017 в число 17. Поэтому открывайте исходник как текст и не пересохраняйте его «просто посмотреть».

Шаг 1. Сохраните оригинал и зафиксируйте смысл строки

Скопируйте исходный файл и дальше работайте только с копией. Оригинал не меняйте никогда: он ваша точка возврата. Затем ответьте на два вопроса письменно: что означает одна строка (один заказ? одна позиция?) и какое поле идентифицирует запись. В нашем примере строка — позиция заказа, код — идентификатор, а значит, одинаковые коды с разным количеством нельзя объединять.

Шаг 2. Попросите найти проблемы, но ничего не исправлять

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

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

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

Шаг 3. Утвердите правила

Правила пишете вы, нейросеть может только предложить черновик. Для нашей таблицы они могут быть такими:

  1. Правило 1. Коды — это текст. Нули в начале сохраняем, 0017 остаётся 0017.
  2. Правило 2. Пустое количество остаётся пустым. Ноль подставлять нельзя.
  3. Правило 3. Названия городов: убрать пробелы по краям, первая буква заглавная. Содержимое «Москва, Тверская» не менять.
  4. Правило 4. Возможные дубликаты не удалять, а помечать для проверки человеком.
  5. Правило 5. Структуру файла (число и порядок колонок, заголовок) не менять.

Правило 4 важнее всего. Две одинаковые строки могут быть настоящим повтором, а могут быть двумя разными заказами с совпадающими данными. Решить это без контекста нельзя.

Шаг 4. Примените правила и потребуйте журнал

Теперь можно просить правку. Требование журнала — обязательная часть запроса:

Примени правила 1–5 к таблице и верни два блока: исправленный CSV и журнал изменений. В журнале для каждой изменённой строки укажи номер, поле, было и стало. Строки, которые ты не изменил, не перечисляй. Пометки о дубликатах дай только в журнале, а не в данных.

Ожидаемый результат для учебной таблицы:

код,город,количество
0017,Москва,2
0018,Москва,
0017,Москва,2
0019,"Москва, Тверская",3
0020,Москва,1

В журнале должно быть ровно два изменения: город у 0018 («москва» → «Москва») и город у 0020 (пробелы убраны), а также пометка «код 0017 повторяется в строках 1 и 3, оставлено для проверки». Если в журнале нет пометки о повторе или есть изменения, которых вы не просили, нужно вернуться к шагу 3.

Шаг 5. Сверьте результат с оригиналом

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

  • число строк до и после совпадает (раз ничего не удаляли);
  • число колонок во всех строках одинаковое;
  • коды остались текстом и сохранили нули;
  • пустые значения остались пустыми.

Для небольшого файла это можно сделать вручную, для большого — коротким скриптом на Python. Ниже пример, который сравнивает два файла по этим пунктам:

import csv

def read(path):
    with open(path, newline="", encoding="utf-8") as f:
        return list(csv.reader(f))

def compare(before_path, after_path):
    before, after = read(before_path), read(after_path)
    problems = []
    if not before or not after or not before[0] or not after[0]:
        return ["файл пуст или отсутствует заголовок"]
    if before[0] != after[0]:
        problems.append("заголовок или порядок колонок изменён")
    width = len(before[0])
    if len(before) != len(after):
        problems.append(f"строк было {len(before)}, стало {len(after)}")
    if any(len(row) != width for row in before + after):
        problems.append("у строк разное число полей")
    for i, (b, a) in enumerate(zip(before, after)):
        if len(b) != width or len(a) != width or not width:
            continue
        if b[0] != a[0]:
            problems.append(f"строка {i}: код {b[0]!r} стал {a[0]!r}")
        if (b[-1] == "") != (a[-1] == ""):
            problems.append(f"строка {i}: изменилась пустота количества")
    return problems

Пустой список означает, что эти проверки пройдены. Это не доказательство, что очистка идеальна, но так вы ловите самые дорогие потери: потерянные строки, съехавшие колонки, пропавшие нули. Модуль csv читает поля с кавычками по тем же правилам, поэтому запись "Москва, Тверская" остаётся одним полем.

Если файл большой

Не вставляйте в чат тысячи строк. Пусть нейросеть поможет с правилами и напишет скрипт, который применяется к файлу целиком одним и тем же способом. Такой скрипт можно запустить повторно и получить тот же результат, а ручное «исправь вот это» — нет. Проверяйте сначала на небольшой выборке из трудных строк, затем на всём файле, и сверяйте числа так же, как на шаге 5.

Тот же принцип «нейросеть готовит черновик, человек остаётся редактором» подробно разобран на другом примере — в материале про тесты и контрольные для урока.

Что нельзя делать при очистке

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

Где потренироваться

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

Частые вопросы

Можно ли доверить нейросети удаление дубликатов?

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

Почему нули в начале кодов пропадают?

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

Чем пустое значение отличается от нуля?

Пусто означает «не знаем», ноль — «знаем, что ноль». Для подсчётов и отчётов это разные ситуации, поэтому подставлять нули вместо пропусков без отдельного решения нельзя.

Как понять, что очистка прошла правильно?

Сверьте число строк и колонок, коды и пустоты до и после, затем проверьте вручную несколько трудных строк из журнала. Если всё совпало, очистку можно считать принятой.

Коротко

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

Like this post? Please share to your friends:
Нейросеть