仕事メモとか

仕事中に調べた情報とか知ったことをメモしています。
unixコマンド, vim, oracle, putty, postgresql, bash, EXCEL, python, SQL全般 など。
最近は tableau, movabletype とかも触ったりしています。
雑な読書感想とかはこちら


postgresqlでoracleのminusみたいなものを探したら、あった(except)

はい、もうタイトルのままなんですが、
postgresqlでは呼び方が変わっていました。

正確にはoracleがminusで、
postgresqlとSQLserverがexceptという表記法でした。
使い方は両方一緒なので、とても簡単。

select aaa from table1
minus
select aaa from table2

これで、table1に居るなかで、table2に居る人を除外(差集合)となります。
なにかの調査の時に、割と切り出しを行うためにminusを使ったりするので(あんまり正式な調査としては良くないのですが)、
最初ないのかな? と思ったけど、あってよかった。


参考:
http://www.sql-reference.com/select/except_minus.html


EXCELで列名のアルファベットをオートフィルでつけたい

はい、EXCELで列名を見ているとアルファベットなのですが、
システムで取り込むときに、そのアルファベット自体が欲しい、っていうことがあります。
ただ、オートフィルはアルファベット自体には対応していないので面倒だし、
AA,ABみたいなものに対応させるのはさらに面倒。

ということでaddress関数から列情報自体を持ってきて加工、という手法をとります。

=SUBSTITUTE(ADDRESS(1,ROW(),4),1,"")

これをA1セルに入れて、オートフィル(またはコピペ)で下にコピーしていくと、
アルファベットが連番で出来上がります。

内部的に見てみると、

ADDRESS(1,ROW(),4)

今のセルの行番号を列に変換し「A1」「B1」のような文字に変換

SUBSTITUTE(xxx,1,"")

後ろの「1」を置換して削除

これでアルファベットの連番を作ることが可能です。



参考:
https://kokodane.com/2013_kan_046.htm
https://www.relief.jp/docs/003721.html


ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list が出た


はい、postgreSQLを使ってる時にこのエラーが出ました。
文中に書いてある通り、

order by してるんだけど、selectにdistinctしてるんだよね、どうすんねん。
というような内容。

order by を辞めるか、distinctではなくgroup by などで明示的に絞るなどすればOKです。

または、サブクエリにして、そのあとorder byを掛ければいいのですが、
ここで地味な落とし穴。

postgreSQLはサブクエリに名前付けないとエラーになります。
oracleと同じ要領で単純に括弧で括っただけだと、今度はそっちのエラーになります。


参考:
https://codeday.me/jp/qa/20190620/1057543.html
http://workmemo.techblog.jp/archives/33958688.html


pythonでZipFileを使ってzip圧縮したらディレクトリ構造まで付いてきたので、ファイルだけにしたい

元々カレントの場所に出力するプログラムを作っていたのですが、
zip圧縮するなら元のファイルは消さないとなー、
くらいに思っていたのですが、

TemporaryDirectoryという素晴らしいものがありまして。

これを使うと一時的に使えるディレクトリが作成できます。
使い終わったら消えます。便利。

んで本題。
出力pathを指定したところ、zip圧縮した中身のファイルもディレクトリ構造をそのまま持ってきちゃいまして。

例)
{TemporaryDirectory}/outfile_{today_str}.csv
をzipにそのまま放り込んだら、「{TemporaryDirectory}/」がそのまま付いてきた。

これを解消する方法を調べたら、
arcnameで入れるファイル名の階層を指定できるので、ファイル名だけをそのまま指定すれば、
zipファイルの中に直接ファイルを入れられる、ということが分かりました。


with TemporaryDirectory() as tempdir:

out_file_name = f'outfile_{today_str}.csv'
out_file_name_zip = f'outfile_{today_str}.zip'
to_csv(df, Path(tempdir) / out_file_name) -- dfをファイルに出力する部分

with ZipFile(out_file_name_zip, 'w') as out_zip:
out_zip.write(Path(tempdir) / out_file_name, arcname=out_file_name)



逆にarcnameにディレクトリ構造を指定することもできるので、
込み入ったディレクトリ構造をzipに入れるタイミングで制御することもできます(あんまり要望無さそう)

pythonでテスト実行した際、EUC-JP使ってないのに、INTERNALERROR> UnicodeEncodeError:
'euc_jp'... っていうエラーがでた

はい、pythonでプログラムを書いてるのですが、未だによくわからないことが発生します。
今回のお題はこちら。

テスト実行したら、こんなんが出た。

INTERNALERROR> UnicodeEncodeError: 'euc_jp' codec can't encode
character '\u9ad9' in position xx: illegal multibyte sequence

●環境
プログラム:python 3.7
エディタ:IntelliJ
テスト環境:IntelliJ組み込みのpytest

●文字コード
テスト対象、テスト用プログラム両方ともUTF-8

●テスト内容
特殊文字のテストもしたかったので、髙(通称、はしごだか)を入れた


テスト実行してみたところ、上記のようなエラーが出ました。
\u9ad9は「髙」なので、これをEUC-JPにしようとしてエラーになりました、とのことなのですが、
そもそもプログラム全部UTF-8なのに? と。

結論から書きますが、IntelliJの基本設定をEUC-JPに変更していることが原因でした。

●設定
[IntelliJ]-[Preferences]-[Editor]-[FileEncodings]

ここのProjectEncodingが「EUC-JP」になっていました。
(デフォルトはUTF-8っぽいのですが、読み込むファイルがEUC-JPが多かったので、変更していたことが原因です。


●解消方法
1.ProjectEncodingは「SystemDefault: UTF-8」に戻します。
2.良く開くファイルはやはりEUC-JPとして開きたいので、そのディレクトリだけ直接指定(下の+ボタンで個別追加)

これで解消できました。

↑このページのトップヘ