csvファイル生成ユーティリティ
3593 ワード
運用メンテナンスでは、お客様が特定のデータ・リストをダウンロードする必要があることがよくあります.一般的にはcsv形式のファイルを提供します.
shellでこのことをすると、通常は2つの方法があります.
1.端末出力をキャプチャし、その後出力に対して一定の処理を行う.しかし,端末出力は実際には多くのフォーマット情報を失っており,完全な処理は困難である.
2.mysqlに内蔵されたFILEコマンドで一度にファイルを生成します.mysqlに内蔵されている関数の機能は限られており、比較的良い出力フォーマットはできません.
だからpythonを選んでやりました.
主な注意点:
1.私たちのデータベースはutf 8符号化を使用しています.したがって、生成されたcsvファイルのデフォルトはutf 8符号化である.実際にはトランスコードすべきではありません.utf 8のunicode文字セットはgbkの等文字セットのスーパーセットであるため、変換によって一部の情報が失われる可能性があります.
2.お客様は一般的にwindowsのexcelソフトウェアを使用してcsvファイルを開きます.excelはutf 8でコードされたcsvファイルを正しく開くには、ファイルの先頭にUTF 8 BOMタグが必要です.
3.改行問題ですが、linuxでの改行は一般的に「」です.Windowsの改行は「r」です.変換したほうがいいです(テストは回らなくても使えるようです).
4.フィールド値の内部に改行がある場合はどうしますか?ここでは、フィールドを二重引用符で囲む必要があります.しかし、これはまた1つの問題を引き起こして、フィールドの値の中に字面量の二重引用符があるのはどのように処理しますか?csv rfcドキュメントによれば、字面量の二重引用符の前に二重引用符を1つ追加して処理する必要があります.
以上のいくつかの問題を処理した後、お客様はexcelを使用してcsvファイルを開くことができるはずです.
次はcsvを生成するツールです:csvtool.py.
使用方法:
csvtool.pyファイルのダウンロードは、次のような独自のスクリプトを書くディレクトリに配置されます.
csvテストスクリプト
shellでこのことをすると、通常は2つの方法があります.
1.端末出力をキャプチャし、その後出力に対して一定の処理を行う.しかし,端末出力は実際には多くのフォーマット情報を失っており,完全な処理は困難である.
2.mysqlに内蔵されたFILEコマンドで一度にファイルを生成します.mysqlに内蔵されている関数の機能は限られており、比較的良い出力フォーマットはできません.
だからpythonを選んでやりました.
主な注意点:
1.私たちのデータベースはutf 8符号化を使用しています.したがって、生成されたcsvファイルのデフォルトはutf 8符号化である.実際にはトランスコードすべきではありません.utf 8のunicode文字セットはgbkの等文字セットのスーパーセットであるため、変換によって一部の情報が失われる可能性があります.
2.お客様は一般的にwindowsのexcelソフトウェアを使用してcsvファイルを開きます.excelはutf 8でコードされたcsvファイルを正しく開くには、ファイルの先頭にUTF 8 BOMタグが必要です.
3.改行問題ですが、linuxでの改行は一般的に「」です.Windowsの改行は「r」です.変換したほうがいいです(テストは回らなくても使えるようです).
4.フィールド値の内部に改行がある場合はどうしますか?ここでは、フィールドを二重引用符で囲む必要があります.しかし、これはまた1つの問題を引き起こして、フィールドの値の中に字面量の二重引用符があるのはどのように処理しますか?csv rfcドキュメントによれば、字面量の二重引用符の前に二重引用符を1つ追加して処理する必要があります.
以上のいくつかの問題を処理した後、お客様はexcelを使用してcsvファイルを開くことができるはずです.
次はcsvを生成するツールです:csvtool.py.
使用方法:
csvtool.pyファイルのダウンロードは、次のような独自のスクリプトを書くディレクトリに配置されます.
csvテストスクリプト
# coding=utf-8
import
csvtool
dp_id
=
'62228616'
sql
=
"SELECT \
i.customerno as
' ID'
, \
i.dp_id as
' '
, \
min
(i.created) as
' '
, \
sum
(i.total_fee) as
' '
, \
(select m.grade
from
plt_taobao_crm_member m where m.customerno
=
i.customerno
and
m.dp_id
=
i.dp_id limit
1
) as
' '
, \
count(distinct i.tid) as
' '
, \
count(i.oid) as
' '
, \
group_concat(i.title SEPARATOR
'||'
) as
' '
\
from
plt_taobao_order_item i \
where i.dp_id
=
'%s'
and
i.ccms_order_status
=
23
and
created
'2013-06-30 23:59:59'
\
group by i.customerno LIMIT
5
"
%
(dp_id, )
generator
=
csvtool.CSVGenerator()
generator.connect(user
=
'root'
, db
=
'ccms_gxg'
, passwd
=
'
', host='
gxg', port
=
3306
)
print
" ..."
generator.query(sql)
print
" ..."
generator.gencsv(
'test.csv'
)
な は です.しかし、いくつかの れたバグがあるかもしれませんが、 を っています.
はBruceweien 51 CTOブログから し、 リンク:http://blog.51cto.com/bruceweien/1932415