小编典典

MySQL转储到CSV文本文件中,列名在顶部?[复制]

sql

我使用以下SQL代码段将表转储为CSV文本文件:

SELECT * FROM brand INTO OUTFILE“ e:/brand.csv”字段以’,’结尾,’‘’以’\ n’结尾;

但是,这种方法不会在CSV文件的开头添加列名。我的问题是如何也选择所有列/字段名称,就像phpMyAdmin在导出表并选择“在第一行中放入字段名称”时所做的一样。


阅读 247

收藏
2021-04-15

共1个答案

小编典典

我想出了一种方法,只要您运行的是MySQL 5或更高版本,就必须手动输入这些名称。它是作为bash脚本编写的,可以在unix命令行上运行:

DBNAME=<database_name>
TABLE=<table_name>

FNAME=/path/to/output/dir/$(date +%Y.%m.%d)-$DBNAME.csv

#(1)creates empty file and sets up column names using the information_schema
mysql -u <username> -p<password> $DBNAME -B -e "SELECT COLUMN_NAME FROM information_schema.COLUMNS C WHERE table_name = '$TABLE';" | awk '{print $1}' | grep -iv ^COLUMN_NAME$ | sed 's/^/"/g;s/$/"/g' | tr '\n' ',' > $FNAME

#(2)appends newline to mark beginning of data vs. column titles
echo "" >> $FNAME

#(3)dumps data from DB into /var/mysql/tempfile.csv
mysql -u <username> -p<password> $DBNAME -B -e "SELECT * INTO OUTFILE '/var/mysql/tempfile.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' FROM $TABLE;"

#(4)merges data file and file w/ column names
cat /var/mysql/tempfile.csv >> $FNAME

#(5)deletes tempfile
rm -rf /var/mysql/tempfile.csv

虽然不是最优雅的解决方案,但我敢肯定,知道SQL和/或bash的人可以比我好一点的人将其压缩为一行…

它的作用是:

  1. 使用MySQL的信息模式来创建带有列标题的空CSV
  2. 向该空CSV追加一个额外的换行符,这样您的数据就会开始出现换行符
  3. 使用一个非常标准的“ SELECT * INTO OUTFILE …”查询来创建一个包含数据的CSV文件
  4. 将数据文件附加到带有列标题的文件上
  5. 删除(临时)数据文件

祝您好运,如果您整理了一下,请发表您的结果!

2021-04-15