Преобразование результатов запроса mysql в CSV (с копией/вставкой)
Я часто работаю в командной строке mysql. Общей потребностью является получение результатов запроса и их импорт в документ Numbers (аналогично документу Excel).
Каков самый быстрый способ для этого?
Способ 1: выберите в outfile
Вы можете выбрать outfile непосредственно из MySQL, но это занимает несколько шагов.
- экспортируйте ваш запрос со всеми необходимыми аргументами, чтобы сделать его CSV-форматом, например
FIELDS OPTIONALY ENCLOSED BY
и DELIMITED BY
.
- sftp на сервер и захватить файл
- удалить файл с сервера
Способ 2: Копировать/вставить
Я стараюсь сделать этот метод. Для меня это выглядит немного быстрее, но в основном потому, что я не помню, как построить запрос SELECT INTO OUTFILE
сверху, и вам придется его искать.
- Скопировать/вставить в локальный текстовый файл
- Открыть в текстовом редакторе и заменить | с,
- Сохранить как CSV и открыть в Numbers.
Ответы
Ответ 1
Как насчет этого?:
mysql -b -e "$ MY_QUERY" > my_data.csv
Формат вывода фактически разделен на вкладку, а не разделен запятой
но по крайней мере Excel и OpenOffice Calc автоматически адаптируются к этому.
BTW, для удобства и обеспечения неинтерактивного выполнения
mysql, я настоятельно рекомендую настроить безопасный файл ~/.my.cnf
(читаемый только вами) с такими элементами:
[client]
user=YOUR_MYSQL_USER_NAME
password=YOUR_MYSQL_PASSWORD
host=YOUR_MYSQL_SERVER
port=YOUR_MYSQL_SERVER_PORT
WHATEVER_OTHER_OPTIONS_YOU_LIKE
Литература:
http://dev.mysql.com/doc/refman/5.1/en/mysql-command-options.html
- пакет, -B
Распечатывайте результаты, используя вкладку в качестве разделителя столбцов, каждая строка в новой строке. С помощью этой опции mysql не использует файл истории.
Пакетный режим приводит к нестандартному формату вывода и экранированию специальных символов. Экранирование может быть отключено с использованием режима raw; см. описание опции -raw.
Ответ 2
Вы также можете использовать утилиту командной строки mysql
с опцией -e
и передать вывод в файл. Это приведет к выходу данных в формате с разделителями табуляции.
Ответ 3
Вы можете выполнить запрос SELECT ... INTO OUTFILE
на вашем локальном компьютере и сохранить его локально. Если у вас установлена локальная утилита mysql *, просто добавьте флаг -h <ip-address>
для подключения к определенному хосту, mysql
также может считываться со стандартного ввода, поэтому вы можете настроить файл .sql, который вы будете использовать для импорта.
Файл SQL (outfile.sql
):
SELECT * FROM myTable WHERE date>CURDATE()
INTO OUTFILE '/home/me/outfile.csv' -- Specify output file (if Windows, make sure
-- to use backslashes and escape them
-- (C:\\Users\\<user>\\...)
FIELDS
OPTIONALLY ENCLOSED BY '"'
ESCAPED BY '"' -- Results in double quotation marks, which I have found Excel
-- requires (instead of using a backslash to escape)
TERMINATED BY '\\n' -- or your line ending of choice
-- (i believe escaping is required)
Затем вы выполните следующую команду:
mysql -u <user> -p -h <server_ip_address> <outfile.sql
Обратите внимание, что может быть хорошей идеей создать нового пользователя, который может подключиться с вашего удаленного IP-адреса, с FILE разрешениями и только SELECT
доступ к таблицам, которые вам нужно запросить.
Сначала он немного инициализируется, но в конце вы можете просто вставить команду mysql
в пакетном файле и сделать процесс с двумя щелчками.
* Я считаю, что вам нужно загрузить полную систему MySQL, которая поставляется с CLI mysql
.
Ответ 4
Используйте свой первый метод со следующей модификацией:
Вместо запуска команды на сервере вы можете запустить ее на своем локальном компьютере и сохранить файл напрямую, без необходимости sftp и удалить его. Для этого вы должны ssh переслать порт mysql в свободный порт на вашей локальной машине.
ssh -L 3306:localhost:3306 [email protected]
Первый "3306" - это порт на локальной машине. "localhost" относится к имени хоста remoteservers. Второй "3306" - это порт на удаленной машине, который должен быть перенаправлен. Если сервер MySQL работает на другом порту, вы должны использовать этот порт. После входа в систему вы держите сессию ssh открытой, пока вы хотите работать.
В новом окне терминала вы можете запустить сеанс mysql.
mysql -hlocalhost -uUser -p --port=3306
Этот метод имеет то преимущество, что вам не нужно выставлять свой MySQL-сервер в Интернет, и вы передаете все данные через зашифрованный туннель.
Ответ 5
Ваш вариант 1 - это лучшее, что я думаю - сделайте это один раз и напечатайте правильные параметры или даже лучше, создайте небольшой script, который примет запрос и автоматически добавит ваши избранные варианты размещения и разделителя.
Вы также можете пропустить шаги 2 и 3, если вы установили себе клиентскую утилиту mysql для вашей клиентской платформы и, если возможно, подключитесь непосредственно к серверу mysql с вашей рабочей станции.
Ответ 6
Excel имеет функцию Text to Columns
в меню Data
, которая позволяет указать пользовательский разделитель. Я предполагаю, что Numbers будут иметь аналогичную функциональность. Если это так, то решение должно копировать и вставлять непосредственно в ваш документ Numbers, а затем преобразовывать эти текстовые ячейки в столбцы, в качестве разделителя указывая |
.