ページ

2013年6月23日日曜日

改行付きcsvのパース

csvからtsvへコンバートが欲しかったのですが、 改行コードが入っているcsvであったため楽にできませんでした。 csvは改行コードがある場合ダブルクォーテンションで囲まれているのが特徴です。
下記のサイトに改行コードが含んでいるcsvをパースする方法がperlありましたので こちら 改変しましてコード化しました。
csv2tsv.pl
#!/usr/bin/perl
use strict;
use warnings;
my $column = '';
while (my $line = ) {
    my $count = 0;
    $line .=  while ($line =~ tr/"// % 2 and !eof(STDIN));
 
    $line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
    my @values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
    ($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
    for $column (@values) {
        $column =~ s/\x0D\x0A|\x0D|\x0A//g;
        print $column, "\t";
    }
    print "\r\n";
}

上記をcsv2tsv.plとしてサンプルを作成いたしました。 test.csv
header1,header2,header3
test1,test2, "test,3"
"test
1",test2,test3 
上記が、サンプル用csvとなります。
cat test.csv | csv2tsv.pl
こちらのサンプルで改行付きcsvをパースできます。

2013年6月18日火曜日

postgresで累計グラフ用のデータを作成

postgresで累計グラフ(積み上げ折れ線グラフ)を作成するための集計を実施します。
使うようで使わない気がしますが、私では利用する頻度が多いのでメモ含め書き留めます。


今回は、あるシステムで6月の日付ごとにコストと集客人数を
入力したテーブルに対して6月の日毎のと累計を知りたいのが目的とします。
環境
環境情報 構築日 ソフトウェア
CentOS 5.6 2013/06/18 postgresql 8.4以降
今回利用するSQLではpostgresql 8.4以降でないと扱えない文法のため 8.4以上でお試しください。 まずは、お決まりのテーブルを作成
-- コスト、集客管理
CREATE TABLE report (
 date TIMESTAMP, -- 集計日
 cost NUMERIC(19, 0), -- コスト 
 person NUMERIC(19, 0) -- 集客人数
);

-- 日毎のデータ
INSERT INTO report VALUES
('2013/06/01', 100, 1),
('2013/06/02', 120, 3),
('2013/06/03', 150, 0),
('2013/06/04', 110, 6),
('2013/06/05', 130, 1),
('2013/06/06', 120, 4),
('2013/06/07', 160, 5),
('2013/06/08', 190, 7),
('2013/06/09', 100, 1),
('2013/06/10', 110, 9),
('2013/06/11', 100, 8),
('2013/06/12', 100, 5),
('2013/06/13', 130, 4),
('2013/06/14', 120, 3),
('2013/06/15', 100, 6),
('2013/06/16', 100, 1),
('2013/06/17', 110, 0),
('2013/06/18', 100, 0),
('2013/06/19', 170, 1),
('2013/06/20', 100, 2),
('2013/06/21', 100, 6),
('2013/06/22', 190, 7),
('2013/06/23', 100, 9),
('2013/06/24', 100, 1),
('2013/06/25', 190, 8),
('2013/06/26', 100, 6),
('2013/06/27', 120, 7),
('2013/06/28', 120, 4),
('2013/06/29', 150, 2),
('2013/06/30', 110, 1);


上記のデータが元データです。 集計には「over」と呼ばれるWindow関数を利用します。

-- 集計用SQL
SELECT date, SUM(cost) over (order by date) AS cost, SUM(person) over (order by date) AS person FROM report;
        date         | cost | person 
---------------------+------+--------
 2013-06-01 00:00:00 |  100 |      1
 2013-06-02 00:00:00 |  220 |      4
 2013-06-03 00:00:00 |  370 |      4
 2013-06-04 00:00:00 |  480 |     10
 2013-06-05 00:00:00 |  610 |     11
 2013-06-06 00:00:00 |  730 |     15
 2013-06-07 00:00:00 |  890 |     20
 2013-06-08 00:00:00 | 1080 |     27
 2013-06-09 00:00:00 | 1180 |     28
 2013-06-10 00:00:00 | 1290 |     37
 2013-06-11 00:00:00 | 1390 |     45
 2013-06-12 00:00:00 | 1490 |     50
 2013-06-13 00:00:00 | 1620 |     54
 2013-06-14 00:00:00 | 1740 |     57
 2013-06-15 00:00:00 | 1840 |     63
 2013-06-16 00:00:00 | 1940 |     64
 2013-06-17 00:00:00 | 2050 |     64
 2013-06-18 00:00:00 | 2150 |     64
 2013-06-19 00:00:00 | 2320 |     65
 2013-06-20 00:00:00 | 2420 |     67
 2013-06-21 00:00:00 | 2520 |     73
 2013-06-22 00:00:00 | 2710 |     80
 2013-06-23 00:00:00 | 2810 |     89
 2013-06-24 00:00:00 | 2910 |     90
 2013-06-25 00:00:00 | 3100 |     98
 2013-06-26 00:00:00 | 3200 |    104
 2013-06-27 00:00:00 | 3320 |    111
 2013-06-28 00:00:00 | 3440 |    115
 2013-06-29 00:00:00 | 3590 |    117
 2013-06-30 00:00:00 | 3700 |    118
(30 行)


苦労してSQLをくまないと行けないと考えていましたがWindow関数で簡単にできました。 EC売り上げ集計や、広告レポートを集計するのに役に立ちそうです。

【mac】capistranoのインストール

macにcapistranoを利用したかったのでまとめました。
sudo等が必要なためCentOS分から一部を抜粋

環境
環境情報 ソフトウェア 必要込コマンド
Mac OS X Mountain Lion ruby sudo,curl
$ sudo mkdir /usr/local/src
$ cd /usr/local/src
$ sudo curl -O http://production.cf.rubygems.org/rubygems/rubygems-1.8.24.tgz
$ sudo tar xzovf rubygems-1.8.24.tgz
$ cd rubygems-1.8.24
$ sudo ruby setup.rb
$ sudo gem install capistrano

capistranoサンプル集【tomcat restart】

capistranoのサンプル集です。 普段利用しているものを少しメモ含めまとめました。
role :host, "test1.com", "test1.com" # サーバを指定複数の場合は,区切りで追記
set :application, "deploy.test" # アプリケーション名
set :ssh_options, :port => "22" # ポート指定
set :user, "admin" # sshでログインするユーザー(要sodo権限)

# tomcat 再起動
task :tomcat-restart, :roles => :host do
 sudo "/etc/init.d/tomcat5 restart"
 sudo "/etc/init.d/httpd restart"
end
単純ですが、意外と使えます。 実運用では、ロードバランサーがあると全tomcatが止まるので監視が飛ぶかもしれない ので要注意です。ご利用の際は、監視を受け取っている方にご連絡を

2013年6月17日月曜日

bashでfor next

備忘録となるがシェル(bash)でforを利用したカウンタを作る際に苦労したので
紹介

やりたいことは、JavascriptやC言語などでよくある
for (i = 0; i < 10; i+=2) {
 処理を記述
}

上記みたいなi+=2のfor文を作りたい


実際にシェルで記載

#!/bin/bash
for i in `seq 0 2 10`;
do
  echo "${i}"
done
上記で対応ができるbash的にはforはforeachみたいな役割なので 少々書き方が面倒だが便利に行えます。