Просьба «почисти таблицу» кажется простой, но именно так в выгрузке и теряются данные: пропадают нули в начале кодов, пустые клетки превращаются в нули, а похожие строки молча сливаются. Нейросеть отлично помогает с очисткой CSV, если дать ей не задачу «сделай красиво», а правила, и потребовать журнал изменений. Ниже — пять шагов, после которых вы можете проверить результат, а не поверить на слово.
Все данные в статье учебные и придуманы для разбора. Свои реальные выгрузки с персональными данными в чат не загружайте.
Почему «Москва», «москва» и « Москва » — разные значения
CSV — простой текстовый формат: одна запись на строку, поля через запятую. Его общепринятое описание дано в RFC 4180. Из него стоит запомнить несколько правил, на которых строится вся очистка:
- пробелы считаются частью поля, и их не нужно игнорировать: значение « Москва » с пробелами по формату отличается от «Москва»;
- поле, где есть запятая, перевод строки или двойная кавычка, заключают в двойные кавычки, а саму кавычку внутри поля удваивают;
- у всех записей должно быть одинаковое число полей;
- первая строка может быть заголовком, но формат сам не говорит, заголовок это или данные, поэтому об этом договариваются отдельно.
Отсюда практический вывод: перед очисткой нужно решить, какие различия считать ошибкой (регистр, пробелы), а какие значением (например, разные коды). Это решение принимает человек, а не модель.
Учебная выгрузка
Возьмём небольшую таблицу заказов. Она содержит типичные проблемы, и в ней есть поле с запятой внутри:
код,город,количество
0017,Москва,2
0018,москва,
0017,Москва,2
0019,"Москва, Тверская",3
0020, Москва ,1
Что здесь видно человеку, но не обязательно видно программе:
- код
0017встречается дважды с одинаковыми данными: возможный дубль; - «москва» с маленькой буквы, а в строке 0020 пробелы вокруг названия;
- у кода
0018количество пустое — это «неизвестно», а не ноль; - в
0019запятая внутри названия защищена кавычками, это корректно, трогать структуру не нужно.
Ещё одна неочевидная опасность: некоторые табличные редакторы при открытии файла могут превратить 0017 в число 17. Поэтому открывайте исходник как текст и не пересохраняйте его «просто посмотреть».
Шаг 1. Сохраните оригинал и зафиксируйте смысл строки
Скопируйте исходный файл и дальше работайте только с копией. Оригинал не меняйте никогда: он ваша точка возврата. Затем ответьте на два вопроса письменно: что означает одна строка (один заказ? одна позиция?) и какое поле идентифицирует запись. В нашем примере строка — позиция заказа, код — идентификатор, а значит, одинаковые коды с разным количеством нельзя объединять.
Шаг 2. Попросите найти проблемы, но ничего не исправлять
Первым запросом не поручайте правку. Попросите описать, что с таблицей не так:
Ниже фрагмент CSV. Не исправляй его. Составь список проблем: ведущие нули, пропуски, разный регистр, лишние пробелы, возможные дубликаты. Для каждой проблемы назови номер строки и покажи фрагмент. Если не уверен, так и напиши.
На этом шаге вы проверяете, видит ли модель то же, что и вы. Если она «нашла» несуществующие проблемы или пропустила очевидные — правки ей поручать рано.
Шаг 3. Утвердите правила
Правила пишете вы, нейросеть может только предложить черновик. Для нашей таблицы они могут быть такими:
- Правило 1. Коды — это текст. Нули в начале сохраняем,
0017остаётся0017. - Правило 2. Пустое количество остаётся пустым. Ноль подставлять нельзя.
- Правило 3. Названия городов: убрать пробелы по краям, первая буква заглавная. Содержимое «Москва, Тверская» не менять.
- Правило 4. Возможные дубликаты не удалять, а помечать для проверки человеком.
- Правило 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 хранит текст и ничего не теряет. Проблема возникает при открытии и пересохранении в программе, которая «угадывает» тип. Поэтому коды лучше считать текстом и проверять после каждого шага.
Чем пустое значение отличается от нуля?
Пусто означает «не знаем», ноль — «знаем, что ноль». Для подсчётов и отчётов это разные ситуации, поэтому подставлять нули вместо пропусков без отдельного решения нельзя.
Как понять, что очистка прошла правильно?
Сверьте число строк и колонок, коды и пустоты до и после, затем проверьте вручную несколько трудных строк из журнала. Если всё совпало, очистку можно считать принятой.
Коротко
Оригинал в сохранности, правила утверждены человеком, правка сопровождается журналом, результат сверен с исходной таблицей по числам. Тогда нейросеть ускоряет работу, а не создаёт скрытые ошибки.
