Qtstalkerで株価データを眺めてニヨニヨするスクリプト

2009年12月8日 Linux, スクリプト関連, 雑記

zigsowで以前公開したものの再掲載。そのうち修正入れて読みやすくするつもり。

記事ここから。————-

自分でよく使うシェルスクリプトを一つ。

Webで株価データを配信している、とってもありがたいサイトからファイルを落としてきてQtstalker用に整形するスクリプト。Qtstalker?何それwwwプゲラって奴は読み飛ばせ。

使い方は簡単。
実行して

当日を含めたファイル取得を行います。
Enter :

って表示されたら数字を入力するだけ。

入力された数字が例えば10だったら10日前のファイルから今日のファイルまでを取得してきてくれる。当日分だけが必要なら0と入力する(ファイル名が日付で管理されているサイトに限られるが)。

中身も簡単なので早速frontend(?)から。

ここから————————
#!/bin/sh
echo 当日を含めたファイル取得を行います。
echo -n “Enter : “
read ans
Dt=`date ‘+%y%m%d’`
if [ ${ans} -eq 0 ]
then
  #当日分の取得
  ’/home/user/dir/down.sh’ $Dt
else
  #当日と前日以前の分の取得
  ’/home/user/dir/down.sh’ $Dt
  a=0
  while [ $a -ne $ans ]
  do
    a=`expr $a + 1`
    Dt1=`date –date “${a}”‘ days ago’ +%y%m%d`
    ’/home/user/dir/down.sh’ $Dt1
  done
fi
ここまで————————

分かる人には見ての通りの
down.shに引数を送りつけるだけのスクリプトなんだけども一応解説。

1.この四行でまずは必要なデータを格納。
 echo 当日を含めたファイル取得を行います。
 echo -n “Enter : “
 read ans
 Dt=`date ‘+%y%m%d’`

[詳説]

 1、2行目は端末内にメッセージを表示して入力待ち。ここでユーザは数字を入力。
 3行目 read ans で ans に入力された数値を格納。
 4行目 Dt=`date ‘+%y%m%d’` で 変数 Dt に書式付きの日付を格納。この場合の書式はYYMMDD

2.残りの15行で処理回数を振り分けて、down.shを引数付きで呼び出す。
if [ ${ans} -eq 0 ]
then
  #当日分の取得
  ’/home/user/dir/down.sh’ $Dt
else
  #当日と前日以前の分の取得
  ’/home/user/dir/down.sh’ $Dt
  a=0
  while [ $a -ne $ans ]
  do
    a=`expr $a + 1`
    Dt1=`date –date “${a}”‘ days ago’ +%y%m%d`
    ’/home/user/dir/down.sh’ $Dt1
  done
fi

[詳説]

 1行目 if [ ${ans} -eq 0 ] は ans に格納された数値が0と同じかを判定。同じなら2〜4行目を実行。違うなら5〜14行目を実行。
 2〜4行目 見たまんま。1行目の判定が真ならば、変数 Dt に格納された書式付きの日付を展開してdown.shを引数付きで呼び出す。
 5〜7行目 見たまんま。1行目の判定が偽ならば、変数 Dt に格納された書式付きの日付を展開してdown.shを引数付きで呼び出す。
 8行目 a=0 で a に 0 を格納。
 9行目 while [ $a -ne $ans ] は ans に格納された数値が0と同じかを判定。同じなら偽、違うなら真となり、真である限り9〜14行目を繰り返す。
 11行目 a=`expr $a + 1` で 変数 a に格納された数値に 1 を足す。
 12行目 Dt1=`date –date “${a}”‘ days ago’ +%y%m%d`で 変数 Dt1 に書式付きの日付を格納。この場合は a 日前の日付。この場合の書式はYYMMDD。
 13行目 見たまんま。繰り返し処理が実行される度に変数 Dt1 に格納された書式付きの日付を展開してdown.shを引数付きで呼び出す。
 14、15行目 終了の印。

とりあえずfrontend(?)はこれで。次はbackend。

ちなみにインデントに全角スペースを使ったのでスクリプトをそのままコピーしても動かないはず。使う人がいるとは思えないけど一応。

この実行部分が揃うと、みんな怠け者になれる。素敵。

ここから一連の動作のコア部分。

fronntend(?)と比べると手抜きっぷりが尋常じゃないってくらい簡単なスクリプト。
引数を付けて実行してやればこれだけでも使える。

frontend(?)はあくまで月1とか週1の一括処理のためのもの。

ここから————————
#!/bin/sh
# ディレクトリ移動
cd /home/user/dir
# 当日分取得
wget -P ./ http://url/dir/$1.LZH
# ファイル展開
lha e $1.LZH
sed -f list.sed $1.csv > T$1.tmp
cp T$1.tmp ./tmp/T$1.tmp
sed -f list2.sed ./tmp/T$1.tmp > T$1.tmp
cp T$1.tmp ./tmp/T$1.tmp
cat -s ./tmp/T$1.tmp | sed ‘/^[[:space:]]*$/d’ > Finish$1.csv
rm $1.LZH T$1.tmp $1.csv ./tmp/T$1.tmp
ここまで————————

説明がいる部分がほとんど無いけど一応解説。

1.コメントアウトした行で説明されている通り。
 # ディレクトリ移動
 cd /home/user/dir
 # 当日分取得
 wget -P ./ http://url/dir/$1.LZH
 # ファイル展開
 lha e $1.LZH

[詳説]

 2行目 cd で作業しやすいディレクトリに移動
 4行目 wget でファイルをダウンロード。オプションで -P を指定しておかないとユーザールートに剥き身でバカバカ落とされて泣くことになる気がする。変数 $1 は実行時の引数が格納されている。
 6行目 展開。他のファイル形式ならそちらに合わせる。

2.ごちゃごちゃしてるだけ。やってることはファイルのコピー・削除と内容の整形のみ。
 sed -f list.sed $1.csv > T$1.tmp
 cp T$1.tmp ./tmp/T$1.tmp
 sed -f list2.sed ./tmp/T$1.tmp > T$1.tmp
 cp T$1.tmp ./tmp/T$1.tmp
 cat -s ./tmp/T$1.tmp | sed ‘/^[[:space:]]*$/d’ > Finish$1.csv
 rm $1.LZH T$1.tmp $1.csv ./tmp/T$1.tmp

[詳説]

 1行目 sed に list.sed という置換リストを与えて $1.csv の内容を置換 T$1.tmp に書き込む。
 2行目 T$1.tmp を ./tmp/T$1.tmp にコピー。
 3行目 sed に list2.sed という置換リストを与えて ./tmp/T$1.csv の内容を置換 T$1.tmp に書き込む。
 4行目 T$1.tmp を ./tmp/T$1.tmp にコピー。
 5行目 cat で ./tmp/T$1.tmp を読み込み結果をパイプで sed に渡す。読み込み結果を受け取った sed が ‘/^[[:space:]]*$/d’ (半角スペースを削除) して Finish$1.csv に書き込む。
 7行目 処理に利用した中継ファイルを削除。
 ※変数 $1 は実行時の引数が格納されている。

こんな感じ。

ちなみに list.sed と list2.sed は自分で作るべきだと思うけど一応サンプルを置いておく。

list.sed

銘柄コードと市場番号の組み合わせになっている部分を、銘柄コードと企業名に置換するリスト。この後もズラリと4000件くらい続く。

 s/,1001,1,/,1001,”nikkei225″,/g
 s/,1002,1,/,1002,”TOPIX”,/g
 s/,1003,1,/,1003,”Cor30″,/g
 s/,1004,1,/,1004,”Lar70″,/g

list2.sed

上場廃止や銘柄変更、市場変更等で使い物にならなくなったデータを削除するリスト。一行で全部。
常に最新の銘柄リストを使えば必要ないけど面倒なのでそのまま削除する方向で運用する。

 s/[0-9]{4}/[0-9]{2}/[0-9]{2},[0-9]{4},[0-9],[0-9]*,[0-9]*,[0-9]*,[0-9]*,[0-9]*//g

[注意事項]

 自分で使うためだけに書いたものなので例外は一切考慮されてません。入力は1回だけなので考える必要もないと思うけど。ちなみに数字の代わりに別な何かを入力したり未入力で実行したりすると多分当日分のみの取得処理が実行されるはず。違ったかな。未確認だけど確認はしない。

コメントは受け付けていません。