仕事メモとか

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

ORA-01723: zero-length columns are not allowed が出たので無理やり対処


はい、ちょっとプログラムを修正していたら、ORA-01723が出ました。

修正内容:
指定のパターンの時だけ、テーブルを作る時に最初から空を設定する。

テーブルを作る部分がラップされていて、SQLを書いたらそいつを元にテーブルを自動生成するようにしているのですが、こいつが悪さをしていました。

select 
 a
 , b
 , c
from table_name

みたいなのを書くとそういう中間テーブルを作るようにしているのですが、ここにnullとか空文字とか入れると、「データの定義がわからん」とORA-01723が出るわけです。

例)
select 
 a
 , null as b
 , '' as c
from table_name

bもcもエラーでコケる。


とりあえず生成部分を修正するのは改修範疇がデカすぎて至急対応に間に合わないため、一旦こうしました。

select 
 a
 , ' ' as b  -- 半角スペースを入れる
from table_name

データ出力部でbを出す時にtrimする。

適切かどうかは、結構邪道だと思いますが(bに本当に半角スペースが入る場合も考慮しないといけない)、データが見切れているのと急ぎ対応だったのでこの措置で切り抜けました。



参考:
http://centromezzo.sakura.ne.jp/wiki/?ORACLE%2FORA-01723
このエントリーをはてなブックマークに追加

超簡単用語:エレベーターピッチ


エレベーターに乗ってる時間(30秒)くらいで説明すること。
今北産業と同じ。


エレベーターピッチをエレベーターピッチで説明してない解説が多い。




このエントリーをはてなブックマークに追加

python+pandasでSQLみたいな挙動まとめ

python移行をしているのですが、今までSQLでなんども実行していた似たようなSQLが、データフレームの世界になって少し便利になりました。

ということで、そのおさらい。


まず、データフレームとしてraw型のデータを取ってきます。
これ自体はよくやるのですが、取ってきた後で結局サマリ情報が欲しいよね、というケースがあります。
それをデータフレームから作る時にこういう風にやると見やすくなった、という例。

データの仕組み)
df
 category,  --これでgroup by とりたい
 id,  -- typeがnull以外の時だけ、この数のユニークが欲しい
 type,
 ...

こういうのがあった時に、typeに値が入ってる時だけidをカウントしたい、しかもユニークで、という場合、SQLならdistinct とか使います。

select category
          , count(distinct case when type is not null then id end ) as id_count 
          ...
 from table
 group by category

これをpython上で見やすくやろうというのが今回の主旨。

    df.loc[df.type.notnull(), 'id_count'] = df.id

    sum_df = df.groupby('category')\
        .agg({
            'id_count': 'nunique',
            ...
        })\
        .reset_index() 

と出来ます。
ちなみに簡単なmax,minならagg内で取れますし、
ユニークにしなくていいならcountとかも使える。単純に行数だけ撮りたいならlenも使える。

ちなみにmax,min,lenなどはシングルコーテーションで括らなくても使えます。


このエントリーをはてなブックマークに追加

python で引数を複数化する

mainを呼ぶときに、今までは引数が1つだったけど、複数入れられる形に変更、という要件がありまして。

@click.argument('dat')

@click.argument('dat', nargs=-1)


こうすると、スペース区切りで複数入力したものを1つに入れられます。
nargsの使い方としてはこんな感じでした。

なんか-1と+の指定の違いがよくわからないけど、時間がないので一旦このまま。


参考:
https://click.palletsprojects.com/en/7.x/arguments/ 
このエントリーをはてなブックマークに追加

UnicodeDecodeError: 'euc_jp' codec can't decode byte 0xe3 in position 17: illegal multibyte sequence が出た


はい、ちょっとプログラムを修正して実行したら、

UnicodeDecodeError: 'euc_jp' codec can't decode byte 0xe3 in position 17: illegal multibyte sequence

というエラーが出ました。
修正箇所に関係なく自分の環境に依存しているようです。
プログラムはbashからpythonを呼んでるやつで、原因の細かい特定は置いておいて、文字コードあたりが問題っぽいので、プログラムを実行するときに


LANG=ja_JP.UTF-8 ./prog.sh

という感じで、UTF8だよ、って宣言した状態でテストして突破しました。
環境依存の解消をした方が良さそうですが、あまり修正箇所以外プログラムを触りたくないので、テストだけこんな感じ。

このエントリーをはてなブックマークに追加

↑このページのトップヘ