忍者ブログ
  • 2024.10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.12
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/11/22 19:31 】 |
収益自動集計スクリプト
毎日いろんな広告の情報を取ってくるのが面倒くさい。
というわけで自動化した。

まず、wgetとかで情報を取得するところからやろうとした。
が、当然認証とかしないと取って来れない。ちょいと面倒くさい。
APIとして用意されてる訳でもない。
htmlを解析する…というのはありえないとして。
csvを取ってくるのが常套だろう。

が、そこはめんどいので、とりあえずcsvをダウンロードするのは手動でいったん妥協。


Rubyスクリプトで、csvを解析して必要な情報だけを取り出す部分を作成する。

RubyにはCSVクラスがあり、若干の癖はあるものの、CSVの読み込み、書き込み、アクセスなどいろいろ便利にやってくれる。
参考

CSVファイルの中身を一気に全部読み込むには

table = CSV.table(filename)


とする。tableはCSV::Tableクラスのインスタンスになり、超便利にデータにアクセスできる。
ただし日本語が取り込めないので、日本人としては使いどころは限定される。


CSVファイルの中身を一行ずつ読み込むには

CSV.foreach(filename) do |row|
:
:
end



を使う。rowは配列になる。


エンコードを指定することもできる。
第2に引数に指定。

CSV.foreach(filename, encoding: 'Shift_JIS:UTF-8') do |row|


とすると、Shift_JISのCSVファイルを読み込み、UTF-8に変換して扱うことができる。便利。


ファイル自体の文字コードをUTF-8に変換する場合は

$ nkf -w --overwrite filename


とする。(-w がUTF-8に変換するオプション。 -s だとShift_JIS、-e だとEUC-JPになる)


出力は

CSV.open(filename, "wb") do |csv|
csv << row1_data
csv << row2_data
:
:
end


となる。

◯コツ
入力ファイル名はスクリプトの第1引数で指定
出力はファイル名指定でもいいが、そのまま標準出力させたほうが扱いやすいともいえる。
ただ、2重配列をそのまま
p data
という感じで出力してもcsvファイル形式にはならないので、おとなしく引数で指定しよう
([["2015/07/01", "1000"], ["2015/07/02", "2000"], ... のように、角カッコやダブルクォートがついてしまう)


◯ディレクトリ
広告ごとに各ディレクトリを作成。
中に、同名のスクリプトを置いておく。


top
+-- nend
+-- parse.rb
+-- imobile
+-- parse.rb
+-- admob
+-- parse.rb



各ディレクトリに入って、各社管理画面からダウンロードしてきたcsvを使えば、1社ずつデータを抽出できる。


◯全部まとめて

さて、全社まとめて処理したい。
先ほど作った各社のparse.rbを呼び出す、統括スクリプトとでも呼ぶべきスクリプトを作る。

スクリプトファイル名は同じにしてあるので、topディレクトリで

#{ad}/parse.rb
を実行すればいい。

ダウンロードしてきたcsvファイルの指定だが、
各社思い思いの名前になっている。
(nendだと、nend_m_20150801_20150804.csv 、imobileだと 日別レポート_20150801-20150804.csv、 admobだとadmob-report.csv など)
ダウンロードして、毎回毎回ファイル名を変更するのはごめんだ。
このファイル名のまま実行できるようにしたい。
特定のディレクトリにそのファイル1つだけを入れる、とかすれば

`ls path/to/dir`.chomp


とかでできるが、毎回全csvファイルを別ディレクトリに保存するのもめんどい。
dataディレクトリは1つで、ファイル名を検索するのがよい。
というわけで、

`ls -1r path/to/dir nend_m_*.csv`.gsub(/\n.*/, "")


というふうにした。
ls -1 オプションは、ファイルを1行ずつ表示。
ls -r オプションは、ファイル名を降順に表示。最新の日付の入ったファイル名から取得するイメージ。(YYYYMMDDじゃなかったらダメになるものもあるきがするが)
gsubは、2行目以降を削除している。


結果出力は
#{ad}/output.csv
のようにやはり名前を統一しておく。


csvに全部まとめた最終出力を行い、
Numbersで自動で開く。

`open -a Numbers #{outfilename}`




で、ダブルクリックで実行できるようにするため、
シェルスクリプトからこのRubyスクリプトを呼び出す。

#! /bin/sh
cd `dirname $0`
ruby correct.rb



このシェルスクリプトを右クリックし、「このアプリケーションで開く」 で「ターミナル」を指定
これで、Finderでダブルクリックで実行できるようになった。

キモは
cd `dirname $0`
で、カレントをファイルの場所に移動させたい。
これが必要なので、Rubyスクリプトをダブルクリック実行させてもうまくいかないのだ。


PR
【2015/08/05 18:09 】 | 開発一般 | 有り難いご意見(0)
<<AndroidStudio | ホーム | cocos2d-x(v3.7)の新しいプロジェクトを作成する>>
有り難いご意見
貴重なご意見の投稿














<<前ページ | ホーム | 次ページ>>