← Все курсы · Курс SQL · Все руководства
Как экспортировать результаты SQL в CSV и Excel
К концу этой страницы вы экспортируете результат запроса и откроете его с ведущими нулями, акцентированными символами и датами, которые по-прежнему верны. Вот что стоит знать прежде всего: ваш экспорт почти наверняка в порядке. Повреждение происходит, когда вы его открываете, и разница между испорченным файлом и чистым заключается в том, каким из двух способов вы открыли один и тот же файл.
Вот чем на самом деле заняться сегодня. Прекратите дважды щелкать экспортированные CSV-файлы. Сначала откройте Excel, затем используйте Данные, Получить данные, Из текста/CSVи откройте файл оттуда. Это одно изменение предотвращает большую часть последующего.
Краткая версия: экспортируйте в формате CSV, откройте его с помощью маршрута импорта, а не двойным щелчком мыши, и добавьте метку порядка байтов, если символы с диакритическими знаками имеют значение.
Один и тот же файл, имеющий две разные судьбы, — это единственная идея, достойная страницы, поэтому она дает представление о картине.
- экспортировать результат
- Доказательство того, что с файлом все в порядке
- Два способа открытия
- Исправление акцентов одним флажком
- Когда вам действительно нужен настоящий .xlsx
- Проверки, которые нужно запускать каждый раз
- Полное до и после
- Что пошло не так и как это исправить
- Почему CSV не может защитить себя
- Использование этого при собственном экспорте
- Все на одном экране
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. Проверки, которые нужно запускать каждый раз
Четыре проверки менее чем за минуту, и они ловят почти все.
- Количество строк. Сравните строки в файле со строками, возвращенными запросом. Тихое усечение выглядит точно так же, как успешный экспорт.
- Оба конца каждого столбца кода. Отсортируйте по нему и посмотрите на первое и последнее значения. Отсутствующие ведущие нули отображаются немедленно.
- Одно акцентированное или неанглийское значение. Если у вас есть данные, найдите их и просмотрите. Эта единственная ячейка говорит о том, что кодировка сохранилась.
- Одно свидание. Сравните это с датой, которую вы знаете. Перестановка дня и месяца — самое распространенное скрытое повреждение общего файла.
Теперь представьте себе последний экспорт, который вы кому-то отправили. Какой из этих четырех вы проверили, прежде чем нажать «Отправить»? Для большинства из нас честный ответ — нет, и это нормально до тех пор, пока файл не попадет к клиенту.
Полное до и после
Тот же запрос, тот же получатель.
До
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).
Использование этого при собственном экспорте
Пять привычек по порядку.
- Никогда не щелкайте дважды по экспортированному CSV-файлу. Даже не для того, чтобы это проверить. Проверять нарушенный маршрут хуже, чем не проверять.
- Экспорт с отметкой порядка байтов когда кто-то еще откроет файл.
- Отправляйте xlsx людям и CSV программам. Вопрос ответит сам собой, если вы спросите, кто его открывает.
- Отформатируйте даты как
YYYY-MM-DDв запросе. Это единственная форма, которую ни одна локаль не может неправильно прочитать. - Перед отправкой выполните четыре проверки. Количество строк, оба конца столбца кода, одно ударение, одна дата.
Если у вас под рукой есть бумага, один дополнительный рисунок стоит двух минут. Перечислите столбцы экспорта и отметьте каждый из них числом, датой или кодом, который просто выглядит как число. Каждый столбец в этой третьей группе — это столбец, который будет разбит, и знать, что это за столбец, прежде чем отправить файл, — это вся работа.
Все на одном экране
Это лист поиска. Закройте правую колонку, проработайте левую и произнесите каждый ответ вслух, прежде чем проверять его.
| вещь | Что это такое или что оно делает |
|---|---|
| Основной факт | CSV хранит значения, а не типы. Все остальное следует за этим. |
| Где происходит повреждение | При открытии, а не при экспорте. Файл обычно правильный. |
| Дважды щелкните | Excel угадывает молча. Нули удалены, акценты искажены. |
| Путь импорта | Данные → Получить данные → Из текста/CSV. Он спрашивает вместо того, чтобы гадать. |
.mode csv / .headers on | sqlite3: установите формат, сохраните имена столбцов. |
.once file.csv | Отправьте в этот файл только следующий результат. |
| Другие режимы | уценка, json, вставка, поле, html, строка. |
| знак порядка байтов | Три байта говорят «это UTF-8». .once --bom. |
| Что исправляет спецификация | Акценты. Не ведущие нули: ни один формат не может сказать, что строка цифр является кодом. |
| Завершающие нули | 5.10 экспортирует как 5.1. Форматирование не является частью значения числа. |
| Настоящий xlsx | df.to_excel('f.xlsx', index=False), нужен openpyxl. Типы сохранились. |
index=False | Останавливает появление безымянного столбца с номером строки. |
| CSV или xlsx | Программа получает CSV. Человек получает xlsx. |
| 15 цифр | Excel теряет цифры после этого навсегда. Установите для столбца значение «Текст». |
| Формат даты | YYYY-MM-DD. Никакая локаль не может его неправильно прочитать. |
| Рядной потолок Excel | 1 048 576. Вместо этого суммируйте в запросе. |
| Четыре проверки | Количество строк, оба конца столбца кода, одно ударение, одна дата. |
Еще одна мысль, и мне бы искренне хотелось услышать ответы других людей. Жалящая версия — это открыть файл, чтобы проверить его, увидеть повреждения и понять, что вы только что сохранили хорошую копию. Что на вас незаметно изменил экспорт, и кто нашел его первым?
Ссылки
- Бисра К., Лю К., Несбит Дж. К., Салими Ф. и Винн П. Х. (2018). Побуждение к самообъяснению: метаанализ. Обзор педагогической психологии, 30(3), 703–725.
SQL для аналитиков занимает 458 страниц, запросы читаются построчно, включая способы формирования набора результатов перед тем, как он покинет базу данных.
SQL для аналитиков, 19 $ →тот Курс SQL охватывает написание запроса, результат которого вы экспортируете, с активной базой данных на вкладке браузера и Курс Excel рассказывает о том, что происходит с ним после его доставки, включая Power Query и проверки, обнаруживающие сбой импорта.
Откройте набор SQL →