Как открыть большой CSV-файл без падения Excel
Приходит CSV, его размер составляет 1,8 ГБ, а Excel либо отказывается от него, либо занимает девять минут и обрезает его. Инстинкт заключается в том, чтобы найти таблицу побольше. Лучше всего перестать пытаться просмотреть все сразу, потому что почти на каждый ваш вопрос можно ответить из первой тысячи строк плюс один агрегат.
Что вы делаете по порядку: просмотр, подсчет, выборка, агрегирование. Загружайте все целиком только в том случае, если для реального вопроса требуется каждая строка.
Краткая версия. Вам нужны столбцы и размер, прежде чем вам понадобятся данные.
Шаг 1: посмотрите вверху
# Windows PowerShell
Get-Content big.csv -TotalCount 1000 | Set-Content sample.csv
# Git Bash, macOS, Linux
head -n 1000 big.csv > sample.csv
Оба читают только начало, поэтому файл размером 50 ГБ ведет себя так же, как файл размером 5 МБ. Открыть sample.csv в Excel, и у вас есть имена столбцов, формат даты, разделитель, указан ли файл в кавычках и есть ли в идентификаторах ведущие нули. Это большая часть того, что вам нужно.
Шаг 2: посчитайте линии
# PowerShell. ReadCount batches the reads, which matters on big files.
(Get-Content big.csv -ReadCount 10000 | Measure-Object -Line).Lines
# Git Bash
wc -l big.csv
Запишите номер. Это единственный способ впоследствии доказать, что импорт загрузил все. Обратите внимание, что количество строк не всегда соответствует количеству записей: поле, содержащее перевод строки в кавычках, делает их разными, что является еще одной причиной проверять итоги, а не доверять глазу.
Шаг 3: возьмите настоящий образец, а не верхний
Первая тысяча строк не является выборкой. Это самая старая тысяча, или по какому-либо экспортному сорту, и любой образец, который вы заметите в них, может быть артефактом этого порядка. Для настоящего взгляда:
-- DuckDB
SELECT * FROM 'big.csv' USING SAMPLE 1000 ROWS;
# pandas, when the file fits in memory
df.sample(1000, random_state=0)
Шаг 4: агрегируйте и возвращайте только сводку
DuckDB — самый короткий путь, поскольку здесь нет этапа импорта:
SELECT strftime(order_date, '%Y-%m') AS month,
region,
COUNT(*) AS orders,
SUM(amount) AS revenue
FROM 'big.csv'
GROUP BY 1, 2
ORDER BY 1, 2;
Это превращает миллионы строк в несколько десятков, которые вставляются в Excel и работают. Настройка находится в настройка DuckDB.
Эквивалент pandas для файла, который не помещается в памяти, читает его по частям:
import pandas as pd
totals = None
for chunk in pd.read_csv('big.csv', chunksize=500_000,
usecols=['order_date', 'region', 'amount']):
g = chunk.groupby('region')['amount'].sum()
totals = g if totals is None else totals.add(g, fill_value=0)
print(totals)
usecols делает большую часть работы там. Чтение трех столбцов вместо сорока часто является решающим фактором в том, уместится ли информация в памяти или нет.
Пять инструментов, ранжированных по тому, когда к ним обращаться
| инструмент | Лучшее в | Затраты |
|---|---|---|
| глава / Получить контент | Увидеть форму за две секунды | Нет, уже установлено |
| DuckDB | SQL над файлом, пока он находится | Одна установка, без импорта |
| SQLite | Вопросы, которые вы будете задавать неоднократно | Импорт, тогда это быстро навсегда |
| pandas | Очистка как часть трубопровода | Память, если не кусать |
| Текстовый редактор, созданный для размера | На глаз сломанный ряд | Только чтение. Никакой агрегации. |
В последней строке: большинство редакторов загружают в память весь файл и перестают быть полезными при размерах в сотни мегабайт. Редакторы этого потока, такие как Эмредактор или глинтвейн, откроют файл размером в несколько гигабайт, и они являются подходящим инструментом ровно для одной задачи — просмотра строки, в которой произошел сбой импорта.
Проверка разделителей и кавычек
- Откройте образец в текстовом редакторе, а не в Excel, и посмотрите на необработанную первую строку.
- Посчитайте разделители в первой строке и в нескольких случайных строках. Они должны совпадать. Строка с надписью более представляет собой запятую без кавычек внутри поля.
- Найдите знак порядка байтов: заголовок первого столбца выглядит как
idозначает спецификацию UTF-8, которую некоторые инструменты будут рассматривать как часть имени. - Проверьте окончания строк. Файл, написанный в Линукс и открытый в Блокноте, раньше отображался как одна длинная строка. Все современное с этим справляется, а старые импортеры еще нет.
Как применить это в своей работе
- Поместите команду просмотра в заметку где-нибудь, где вы ее найдете. Это единственная наиболее часто используемая команда на этой странице.
- Подсчитайте строки до и после каждого импорта и сохраните оба числа в книге.
- Установите DuckDB в следующий раз, когда файл превзойдет Excel, а не в третий раз.
- Запросите исходную систему для агрегированного или отфильтрованного экспорта. Половина всей работы с большими файлами не нужна.
- Никогда не делайте выборку сверху, когда ищете проблемы с качеством данных. Группа плохих строк, обычно в конце.
Единственная привычка, которую нужно сохранить
Посмотрите на файл, прежде чем загружать его. Две команды, десять секунд, и они предотвращают почти все важные сюрпризы, которые стоят целого дня.
Знаете ли вы количество строк в последнем фрагменте, на котором вы построили отчет?
Python для аналитиков — это рабочая книга по аналитике pandas: прочитайте файл, исправьте его типы, сгруппируйте его, присоединитесь к нему и проверьте ответ, прежде чем его увидит кто-либо еще.
Python для аналитиков, 19 $ →DuckDB запрашивает CSV на месте, SQLite сохраняет его на случай повторных вопросов и Обработка больших наборов данных работает реальный двухгигабайтный файл.
Настроить DuckDB →