BASH MySQL Query to Comma Separated File - PullRequest
       6

BASH MySQL Query to Comma Separated File

2 голосов
/ 21 сентября 2009

У меня есть следующий скрипт bash:

#!/bin/sh

MYSQLHOST="mysql.remote-host.com"
MYSQLDB="mysqldb"
MYSQLTABLE="table"
MYSQLUSER="user"
MYSQLPASS="pass"
MYSQLDUMP="Report/report.csv"
LOG="Report/report.log"

MYSQLOPTS="--user=${MYSQLUSER} --password=${MYSQLPASS} --host=${MYSQLHOST} ${MYSQLDB}"


echo "Report Begin: $(date)"
 echo "MySQL Dump Begin: $(date)" >> ${LOG}
  echo "SELECT ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | mysql ${MYSQLOPTS} > ${MYSQLDUMP}
 echo "MySQL Dump End: $(date)" >> ${LOG}
echo "Report Successful: $(date)"

Это выводит мой MySQL Query в " TAB " отдельный файл report.csv . Однако мне нужно, чтобы он выводился в отдельный файл " COMMA ". Я понимаю, что мог бы создать другой скрипт для преобразования этого файла из TAB в разделенный COMMA, однако я бы предпочел сохранить этот шаг, если смогу. Итак, как я могу получить MySQL дамп файла в формате через запятую?

EDIT: Я нашел это решение: Как вы выводите результаты запросов MySQL в формате csv (на экран, а не в файл)?

Однако я не могу заставить его работать:

echo "SELECT CONCAT_WS(',', ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options) FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | mysql ${MYSQLOPTS} > ${MYSQLDUMP}

Не работает: (

Ответы [ 5 ]

1 голос
/ 21 сентября 2009

Запустите следующее:

echo "SELECT CONCAT_WS(',', ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options) FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | \
mysql ${MYSQLOPTS}  | tr '\t' ',' > ${MYSQLDUMP}

Команда tr заменяет один символ другим.

0 голосов
/ 21 сентября 2009

Нашел простой perl 1-liner, который, кажется, делает свое дело:

perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F '

- Perl Script

Итак, строка в моем скрипте выглядит так:

        echo "SELECT ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options FROM ${MYSQLTABLE} WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at" | mysql ${MYSQLOPTS} | perl -F"\t" -lane 'print join ",", map {s/"/""/g; /^[\d.]+$/ ? $_ : qq("$_")} @F ' > ${MYSQLDUMP}

Спасибо за всю помощь, особенно от Билла Карвина, я хотел добавить в ваш ответ VoteUp, но мне не хватает репутации :( Как только я получу больше повторений, я вернусь и проголосую за ваш ответ. Еще раз спасибо.

0 голосов
/ 21 сентября 2009

Вам не нужен другой скрипт для этого. Просто измените:

> ${MYSQLDUMP}

в конце вашей строки читать:

| sed 's/\x09/,/g' > ${MYSQLDUMP}

Но вы должны быть осторожны, чтобы в ваших данных не было запятых, или они будут неправильно распознаны любым, кто использует файл CSV (но у вас уже может быть эта проблема с вкладками).

0 голосов
/ 21 сентября 2009

Почему бы не использовать

SELECT ${MYSQLTABLE}.created_at, ${MYSQLTABLE}.product_options INTO outfile '${MYSQLDUMP}' FROM ${MYSQLTABLE} FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' WHERE ${MYSQLTABLE}.product_id=1 ORDER BY ${MYSQLTABLE}.created_at
0 голосов
/ 21 сентября 2009

Вот пример SQL-запроса, который выводится в файл через запятую:

SELECT a,b,a+b INTO OUTFILE '/tmp/result.txt'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM test_table;

Комментарии: достаточно справедливо, синтаксис INTO OUTFILE записывает данные в файл на хосте сервера базы данных, а не на хост, на котором запущен скрипт оболочки и клиент mysql.

Клиент mysql не имеет режима вывода csv, он имеет только табличный формат с черточками и тире (с флагами --table или -t), формат с разделителями табуляции (с --batch или -B флаги), формат HTML (--html или -H) и XML (--xml или -X).

Если в вашей базе данных есть содержимое, содержащее вкладки, либо преобразуйте вкладки во что-то другое, используя функцию SQL REPLACE(), либо выведите в другой формат и попробуйте преобразовать это в csv:

mysql ... --table --skip-column-names |
sed -e 's/  *|  */,/g' \
    -e 's/^|  *//' \
    -e 's/  *|$//' \
    -e '/^+--/d'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...