← Все курсы · Курс SQL · Все руководства

Как экспортировать результаты SQL в CSV и Excel

Вытащить файл несложно. Открытие его с сохранением данных — это та часть, которую никто не объясняет. · Часть Analyst Prep Kit

К , аналитик данных · Опубликовано

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

Вот чем на самом деле заняться сегодня. Прекратите дважды щелкать экспортированные CSV-файлы. Сначала откройте Excel, затем используйте Данные, Получить данные, Из текста/CSVи откройте файл оттуда. Это одно изменение предотвращает большую часть последующего.

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

Один и тот же файл, имеющий две разные судьбы, — это единственная идея, достойная страницы, поэтому она дает представление о картине.

One file, two ways of opening it A single file icon on the left, with two arrows leaving it and ending in two separate spreadsheet grids on the right. The upper grid's first cell is drawn with a crossed-out block and its second cell contains a jumbled cluster of marks, showing values that arrived damaged. The lower grid's matching cells are drawn cleanly and intact. The file icon itself is identical for both paths and is drawn with a tick beside it, marking the file as correct in both cases. double-click Data → From Text/CSV
Галочка стоит на файле, а не на каком-либо результате. Байты на диске в обоих случаях идентичны, отличается только путь к электронной таблице.
Что ты будешь делать
  1. экспортировать результат
  2. Доказательство того, что с файлом все в порядке
  3. Два способа открытия
  4. Исправление акцентов одним флажком
  5. Когда вам действительно нужен настоящий .xlsx
  6. Проверки, которые нужно запускать каждый раз
  7. Полное до и после
  8. Что пошло не так и как это исправить
  9. Почему CSV не может защитить себя
  10. Использование этого при собственном экспорте
  11. Все на одном экране
Каждый байт на этой странице реален. Экспорт был запущен 8 августа 2026 года с использованием SQLite 3.51.1, и файлы проверялись побайтно, а не описывались по памяти. Такое же поведение применимо и к экспорту из других инструментов баз данных, поскольку причиной является формат файла, а не инструмент.

1. Экспортируйте результат

Перед пояснением: CSV — это обычный текст с запятыми. Что такой файл может сказать о том, 01234 это номер или код?

В графическом инструменте, таком как Браузер БД для SQLite, запустите запрос и используйте кнопку экспорта над результатами или выберите «Файл», затем «Экспорт», затем «Таблицы» в формате CSV. В pgAdmin или Студия управления SQL Serverом эквивалентом является опция «Сохранить результаты как» или «Экспорт» в таблице результатов.

Из командной строки это делают три строки:

sqlite3 mydata.db
.mode csv
.headers on
.once results.csv
SELECT * FROM invoices;

.mode csv устанавливает формат вывода, .headers on сохраняет имена столбцов и .once отправляет в этот файл только вывод следующей команды. Есть и другие режимы, о которых стоит знать: markdown для вставки в документацию, json для подачи другой программы, и insert для генерации операторов SQL, которые перестраивают строки в другом месте.

Что касается вступительного вопроса, то ответ — ничего. CSV вообще не содержит информации о типе, что является корнем всего нижеперечисленного.

2. Доказательство того, что с файлом все в порядке.

Я экспортировал строку, содержащую четыре элемента, которые обычно ломаются: код с ведущими нулями, слово с ударением, десятичную дробь и дату. Затем я посмотрел на фактические байты на диске.

postcode,name,amount,d
01234,"Café",5.1,2026-03-04

Нули есть. 01234, все пять символов. Акцент тоже присутствует и хранится в виде двух байтов, которые UTF-8 использует для é. Дата указана в однозначной форме год-месяц-день. От экспорта ничего не потеряно.

Одна вещь действительно изменилась, и ее стоит назвать, потому что это делает экспорт, а не Excel: я попросил 5.10 и в файле написано 5.1. Завершающие нули — это форматирование отображения, а не часть значения числа, поэтому они не сохраняются при записи. Если в выводе важны два десятичных знака, отформатируйте столбец в текстовом виде в запросе, а не ожидайте, что файл запомнит.

3. Два способа открытия

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

01234 выглядит числом, поэтому оно становится числом 1234, а нули исчезают навсегда. Слово с ударением возникает как Café, поскольку Excel использовал другой набор символов, чем тот, который использовался в файле.

Теперь откройте тот же файл другим способом. В Excel перейдите к Данные, затем Получить данные, затем Из текста/CSVи выберите файл. Появится предварительный просмотр с раскрывающимися списками, точно такими, как описано в импорт CSV в Power BI, потому что это один и тот же базовый инструмент. Установите для параметра «Происхождение файла» значение UTF-8, выберите Преобразование данных, установите тип столбца почтового индекса на «Текст» и загрузите.

Оба раза один и тот же файл. Второй маршрут задает вам вопросы, на которые от вашего имени отвечает первый маршрут, и в этом вся разница. Ведущие нули исправляют рассказывает об этом более подробно и Кодировка символов объясняет é.

4. Исправление акцентов одним флажком

Если люди будут продолжать дважды щелкать ваш файл, и они будут это делать, вы можете решить проблему с кодировкой в ​​​​конце экспорта.

A знак порядка байтов — это три невидимых байта в самом начале файла, которые объявляют «это UTF-8». Excel читает их и получает правильный набор символов, не спрашивая об этом. Большинство экспортированных баз данных не включают его, поэтому акценты разбиваются.

В sqlite3 добавление одного флага:

.once --bom results.csv
SELECT * FROM invoices;

Прежде чем читать дальше, скажите, что это исправляет, а что нет. Это исправляет акценты, потому что в файле теперь указана собственная кодировка. Он не исправляет ведущие нули, поскольку никакой знак порядка байтов не может сказать Excel, что столбец цифр на самом деле является кодом. Нули требуют либо маршрута импорта, либо изменения в запросе.

В том же инструменте есть похожий трюк: .excel отправляет следующий результат прямо в ваше приложение для работы с электронными таблицами, и это занимает --bom слишком. Удобен для быстрого просмотра, менее хорош в качестве повторяемого шага.

5. Когда вам действительно нужен настоящий .xlsx

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

import sqlite3
import pandas as pd

con = sqlite3.connect('mydata.db')
df = pd.read_sql("SELECT * FROM invoices", con)
df.to_excel('results.xlsx', index=False)

Это требует openpyxl установлен рядом с pandas. Преимущество реально: в xlsx хранится тип каждой ячейки, поэтому текстовый столбец остается текстовым, нули сохраняются, а акценты никогда не подвергаются сомнению. Получатель дважды щелкает по нему, и все правильно.

index=False имеет большее значение, чем кажется. Без него вы получите дополнительный безымянный первый столбец, содержащий номера строк, что затем сбивает с толку того, кто получает файл, что он думает, что это идентификатор.

Выбирайте CSV, когда файл передается другой программе, и xlsx, когда человек собирается его открыть. В этом все правило, и оно обычно решается само собой, как только вы спрашиваете, кто на другом конце провода.

6. Проверки, которые нужно запускать каждый раз

Четыре проверки менее чем за минуту, и они ловят почти все.

  1. Количество строк. Сравните строки в файле со строками, возвращенными запросом. Тихое усечение выглядит точно так же, как успешный экспорт.
  2. Оба конца каждого столбца кода. Отсортируйте по нему и посмотрите на первое и последнее значения. Отсутствующие ведущие нули отображаются немедленно.
  3. Одно акцентированное или неанглийское значение. Если у вас есть данные, найдите их и просмотрите. Эта единственная ячейка говорит о том, что кодировка сохранилась.
  4. Одно свидание. Сравните это с датой, которую вы знаете. Перестановка дня и месяца — самое распространенное скрытое повреждение общего файла.

Теперь представьте себе последний экспорт, который вы кому-то отправили. Какой из этих четырех вы проверили, прежде чем нажать «Отправить»? Для большинства из нас честный ответ — нет, и это нормально до тех пор, пока файл не попадет к клиенту.

Полное до и после

Тот же запрос, тот же получатель.

До

Run query → Export CSV → double-click to check → looks fine → email it
Recipient: "the postcodes are wrong and the names have symbols in them"

Ловушка заключается в том, что проверка двойным щелчком мыши использует тот же сломанный маршрут, что и получатель, поэтому файл выглядит для вас нормально именно так, как он будет выглядеть для них сломанным. Хуже того, если вы сейчас сохранитесь из этого окна, ущерб будет записан в файл по-настоящему.

после

Run query → Export CSV with --bom
Open via Data → Get Data → From Text/CSV, set the code column to Text
Check: row count, both ends of the code column, one accent, one date
Person on the other end? Send .xlsx instead. Program? Send the CSV.

Метка порядка байтов защищает получателя, который дважды щелкает мышью, маршрут импорта защищает вас во время проверки, а четыре проверки фиксируют все остальное. Выбор xlsx для человека полностью снимает вопрос.

Что пошло не так и как это исправить

Шесть, которые стоит знать.

Ведущие нули исчезли. Excel читает код как число. Импортируйте маршрут со столбцом «Текст» или отправьте xlsx.

é где é должно быть. Кодирование. Экспортировать с --bomили установите для источника файла значение UTF-8 при импорте.

Длинный номер стал 1.23457E+14. Научное обозначение. Все, что превышает 15 цифр, также безвозвратно теряет свои последние цифры, что важно для номеров карт и длинных идентификаторов. Установите для столбца значение «Текст» при импорте и никогда не позволяйте файлу сохраняться из этого состояния.

Сроки истекают на месяц. День и месяц меняются местами в зависимости от локали. Экспортировать даты как YYYY-MM-DD, который нельзя неправильно прочитать, и явно задайте тип при импорте.

Строки разделены по строкам. Текстовое поле содержит разрыв строки. Правильное цитирование решает эту проблему, но убедитесь, что все, что читает файл, учитывает разрывы строк в кавычках.

Слишком много строк для Эксель. Рабочий лист останавливается на 1 048 576 строк. Если вы близки к этому, ответом будет суммировать запрос, а не экспортировать больше, и Обработка больших наборов данных покрывает остальное.

Почему CSV не может защитить себя

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

Кодирование имеет ту же форму. Файл представляет собой последовательность байтов, и то, какие буквы представляют эти байты, зависит от набора символов, который в файле обычно не называется. Знак порядка байтов существует именно для того, чтобы имя файла имело собственную кодировку, поэтому его добавление исправляет акценты и не может исправить нули. Один из них — это факт, который файл может сообщить о себе; другой — это факт, который никто не зафиксировал.

С этой точки зрения маршрут импорта не является обходным путем. Это формат, работающий так, как задумано: его дает человек, который знает ответ, а не программа, предполагающая за него.

Одно замечание по поводу написания этой страницы. Он постоянно просил вас дать ответ, что CSV может сказать о коде, что не исправляет знак порядка байтов, прежде чем дать его. Попытка дать ответ до того, как вы увидите правильный, достоверно повышает, насколько хорошо сохраняется правильный ответ, даже если попытка неверна (Бисра, Лю, Несбит, Салими и Винн, 2018, Обзор педагогической психологии, 30(3), 703–725).

Использование этого при собственном экспорте

Пять привычек по порядку.

  1. Никогда не щелкайте дважды по экспортированному CSV-файлу. Даже не для того, чтобы это проверить. Проверять нарушенный маршрут хуже, чем не проверять.
  2. Экспорт с отметкой порядка байтов когда кто-то еще откроет файл.
  3. Отправляйте xlsx людям и CSV программам. Вопрос ответит сам собой, если вы спросите, кто его открывает.
  4. Отформатируйте даты как YYYY-MM-DD в запросе. Это единственная форма, которую ни одна локаль не может неправильно прочитать.
  5. Перед отправкой выполните четыре проверки. Количество строк, оба конца столбца кода, одно ударение, одна дата.

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

Подробнее об этом и еще что-нибудь подобное. Все инструкции находятся в одном месте на индекс направляющих: настройка, SQL, Excel, Python и навыки работы с ними.

Все на одном экране

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

вещьЧто это такое или что оно делает
Основной фактCSV хранит значения, а не типы. Все остальное следует за этим.
Где происходит повреждениеПри открытии, а не при экспорте. Файл обычно правильный.
Дважды щелкнитеExcel угадывает молча. Нули удалены, акценты искажены.
Путь импортаДанные → Получить данные → Из текста/CSV. Он спрашивает вместо того, чтобы гадать.
.mode csv / .headers onsqlite3: установите формат, сохраните имена столбцов.
.once file.csvОтправьте в этот файл только следующий результат.
Другие режимыуценка, json, вставка, поле, html, строка.
знак порядка байтовТри байта говорят «это UTF-8». .once --bom.
Что исправляет спецификацияАкценты. Не ведущие нули: ни один формат не может сказать, что строка цифр является кодом.
Завершающие нули5.10 экспортирует как 5.1. Форматирование не является частью значения числа.
Настоящий xlsxdf.to_excel('f.xlsx', index=False), нужен openpyxl. Типы сохранились.
index=FalseОстанавливает появление безымянного столбца с номером строки.
CSV или xlsxПрограмма получает CSV. Человек получает xlsx.
15 цифрExcel теряет цифры после этого навсегда. Установите для столбца значение «Текст».
Формат датыYYYY-MM-DD. Никакая локаль не может его неправильно прочитать.
Рядной потолок Excel1 048 576. Вместо этого суммируйте в запросе.
Четыре проверки Количество строк, оба конца столбца кода, одно ударение, одна дата.
Единственная привычка, которую следует сохранить. Никогда не открывайте экспортированный CSV-файл, дважды щелкнув его, в том числе во время только проверки. Это единственное правило устраняет два наиболее распространенных скрытых повреждения и не позволяет вам подтвердить, что с файлом все в порядке, используя именно тот маршрут, который его нарушает. Если что-то сломалось так, как не описано на этой странице, существует общая шлейф диагностики на предмет застревания.

Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. Жалящая версия — это открыть файл, чтобы проверить его, увидеть повреждения и понять, что вы только что сохранили хорошую копию. Что на вас незаметно изменил экспорт, и кто нашел его первым?

Ссылки

Запрос верен, и экспорт приходит с датами в виде текста и идентификаторами, в которых отсутствуют нули.

SQL для аналитиков занимает 458 страниц, запросы читаются построчно, включая способы формирования набора результатов перед тем, как он покинет базу данных.

SQL для аналитиков, 19 $ →
Экспорт — последний шаг. Запрос – это работа.

тот Курс SQL охватывает написание запроса, результат которого вы экспортируете, с активной базой данных на вкладке браузера и Курс Excel рассказывает о том, что происходит с ним после его доставки, включая Power Query и проверки, обнаруживающие сбой импорта.

Откройте набор SQL →