Преобразование результатов запроса 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, а затем преобразовывать эти текстовые ячейки в столбцы, в качестве разделителя указывая |.