Конвертировать результаты запроса MySQL в CSV (с копированием / вставкой) - PullRequest
15 голосов
/ 14 января 2010

Я часто работаю в командной строке mysql. Общей необходимостью является получение результатов запроса и их импорт в документ Numbers (аналог документа Excel).

Какой самый быстрый способ сделать это?

Способ 1: выбрать в выходной файл

Вы можете выбрать файл непосредственно из MySQL, но для этого нужно выполнить несколько шагов.

  1. экспортируйте запрос со всеми необходимыми аргументами, чтобы сделать его в формате CSV, например FIELDS OPTIONALY ENCLOSED BY и DELIMITED BY.
  2. sftp на сервер и захватите файл
  3. удалить файл с сервера

Способ 2: копирование / вставка

Я склонен делать этот метод. Для меня это кажется немного быстрее, но это в основном потому, что я не помню, как построить запрос SELECT INTO OUTFILE сверху, и мне приходится искать его.

  1. Копировать / вставить в локальный текстовый файл
  2. Открыть в текстовом редакторе и заменить | с,
  3. Сохранить как CSV и открыть в Numbers.

Ответы [ 6 ]

10 голосов
/ 26 февраля 2010

Как насчет этого?:

mysql -B -e "$ MY_QUERY"> my_data.csv

Формат вывода фактически разделен табуляцией, а не запятыми но по крайней мере Excel и OpenOffice Calc автоматически адаптируются к этому.

Кстати, для удобства и включения неинтерактивного выполнения 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.

7 голосов
/ 14 января 2010

Вы также можете использовать утилиту командной строки mysql с параметром -e и направить вывод в файл. Это выведет данные в формате с разделителями табуляции.

2 голосов
/ 01 марта 2010

Используйте ваш первый метод со следующей модификацией:

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

ssh -L 3306:localhost:3306 user@remoteserver

Первый «3306» - это порт на локальной машине. «localhost» относится к имени хоста удаленного сервера. Второй «3306» - это порт на удаленном компьютере, который должен быть переадресован. Если MySQL Server работает на другом порту, вы должны использовать этот порт. После входа в систему вы оставляете сеанс ssh открытым до тех пор, пока хотите работать.

В новом окне терминала вы можете начать сеанс MySQL.

mysql -hlocalhost -uUser -p --port=3306

Преимущество этого метода заключается в том, что вам не нужно выставлять MySQL Server в Интернет, и вы передаете все данные через зашифрованный туннель.

2 голосов
/ 26 февраля 2010

Вы можете выполнить запрос 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, которая поставляется с mysql CLI.

0 голосов
/ 26 февраля 2010

Excel имеет функцию Text to Columns в меню Data, которая позволяет указать пользовательский разделитель. Я предполагаю, что номера будут иметь аналогичную функциональность. Если это так, то решение состоит в том, чтобы скопировать и вставить непосредственно в документ Numbers, а затем преобразовать эти текстовые ячейки в столбцы с указанием | в качестве разделителя.

0 голосов
/ 26 февраля 2010

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

Вы также можете пропустить шаги 2 и 3, если самостоятельно установите клиентскую утилиту mysql для своей клиентской платформы и по возможности подключитесь к серверу mysql со своей рабочей станции.

...