新着記事

2005年02月16日

CSVファイルの「でこぼこ」を正すperlスクリプト (日曜大工プログラミング)

下のような、CSV形式のファイルがあります。
(「国内株式2005/2/15 値上がり率上位20銘柄」から作成したデータです。)


Excelで見るならともかく、テキストエディタで見る場合、
各データの幅が違っているため、縦の列がとてもわかりづらいですよね。
formatCSV_pl_pre.jpg
(>_<) でこぼこ〜




このCSVファイルの各データに、半角スペースを必要な数だけ追加して、
各データの幅を統一、整形してしまうperlスクリプトを作成してみました。

その作ったスクリプトのコードが↓

#!/usr/bin/perl -w
use strict;

my @list = ();
while (<>) {
s/\x0d\x0a|\x0d|\x0a/\n/g;
chomp;
my @fs = parse_csv_file($_);
my @dbld = dbl_quoted_array(@fs);
push(@list, \@dbld);
}
my @sizelist = count_max_field_size(@list);

# print
foreach (@list) {
my @line = @$_;
for (my $i = 0; $i < @line; $i ++ ) {
if ($i + 1 < @line) {
print formatted_string($line[$i], $sizelist[$i]) . ',';
} else {
print $line[$i];
}
}
print "\n";
}


# parse csv file, and return field values array
sub parse_csv_file {
my $text = shift;
my @new = ();
push(@new, $+) while $text =〜 m{
"([^\"\\]*(?:\\.[^\"\\]*)*)",?
| ([^,]+),?
| ,
}gx;
push(@new, undef) if substr($text, -1,1) eq ',';
return @new;
}

# return double quoted string array
sub dbl_quoted_array {
my @new = ();
foreach my $i (@_) {
if (defined $i && $i ne '') {
$i =〜 s/\"/\"\"/g;
$i = '"' . $i . '"';
push(@new, $i);
} else {
push(@new, '""');
}
}
return @new;
}

# count max size
sub count_max_field_size {
my @new = ();
foreach my $l (@_) {
my @one = @$l;
for (my $i = 0; $i < @one; $i ++ ) {
my $str = $one[$i];
my $len = length $str;
if ($i < @new) {
if ($len > $new[$i]) {
$new[$i] = $len;
}
} else {
push (@new, $len);
}
}
}
return @new;
}

# put en quad if string length is short
sub formatted_string {
my $str = $_[0];
my $len = $_[1];
my $strlen = length $str;
if ($strlen < $len) {
my $sub = $len - $strlen;
$str = $str . (' ' x $sub);
}
return $str;
}
↑公開時より、少し修正が入っています。



標準入力からCSV形式のファイルを読み込ませると、
整形して吐き出すようになっています。
このスクリプトの実行例
./formatCSV.pl < csvfile.csv

もし、他のファイルに保存するなら
./formatCSV.pl < csvfile.csv > formatted.csv


実行結果は、下のようになりました。
formatCSV_pl_post.jpg



このスクリプトのお持ち帰りはこちらから。



本日は以上です。
posted by 小見 拓 at 03:34| Comment(0) | TrackBack(0) | コマンドライン | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
記事検索
 
カテゴリ
最近のコメント
QKCのインストール [3-4/18]
 ⇒ kova (05/23)
calendar.vimには日記をつける機能があったらしい。
 ⇒ とまと (03/07)
最近よく見るようになったvimスクリプトのコメントの書き方
 ⇒ 小見 拓 (02/13)
 ⇒ kana (02/11)
vimエディタ ヘルプのgrep
 ⇒ みかん (07/15)
指定したカラム位置にテキストを流し込む (vimエディタ)
 ⇒ こみ (03/20)
 ⇒ とおりすがり (03/19)
 ⇒ こみ (03/18)
 ⇒ takayama (03/18)
tempfile -- Generate temporary files (Mac OSX)
 ⇒ take3 (01/20)
 ⇒ こみ (01/19)
 ⇒ take3 (01/18)
 ⇒ こみ (01/17)
 ⇒ take3 (01/14)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#2
 ⇒ (06/30)
 ⇒ Tetsuya Kuramochi (06/29)
 ⇒ Tetsuya Kuramochi (06/29)
WebObjectsのオープンソースプロジェクト Project Wonderってなんじゃろな。#1
 ⇒ (06/03)
 ⇒ Tetsuya Kuramochi (06/02)
最近のトラックバック
vimエディタで「文字コード、改行コードを変更して保存する。」
 ⇒ window.closed (04/25)
 ⇒ himesuke’s STEP-log (03/18)
 ⇒ PukiWiki/TrackBack 0.2 (05/07)
vimエディタの折りたたみ機能の話。その2 (foldmethod=syntax)
 ⇒ 俺の基地 (PukiWiki/TrackBack 0.3) (04/20)
ログファイルを監視して、特定のキーワードが見つかったら、何らかのコマンドを実行する。
 ⇒ Apple Fan (10/16)
ファイル保存ダイアログの初期ディレクトリについての話 (vimエディタ話)
 ⇒ ナレッジエース (07/23)
:e <C-x> (編集中のファイルと同じディレクトリにあるファイルを開く。)
 ⇒ ボクノス (02/07)
Opening many files using wildcards.
 ⇒ PukiWiki Plus! (PukiWiki/TrackBack 0.4) (10/28)
 ⇒ 川o・-・)<2nd life (07/18)
vimエディタで印刷自由自在 その8 -エディタからの直接の印刷の代わりに、2html.vimスクリプトを使用する-
 ⇒ Knoppix Temporary Directory (PukiWiki/TrackBack 0.3) (02/19)
検索でマッチした対象に対して、置換を行う。(vimエディタ話)
 ⇒ 123net :: 開発日記 (12/31)
ごみ箱にファイルを叩き込むスクリプト。(vimエディタ)
 ⇒ "OSX" .app's :Macのアプリを便利、感動、面白をベースにほぼ日刊で紹介。 (11/26)
パーセント、%、percent でのカーソル移動 (vimエディタ話)
 ⇒ プログラミング言語 (10/11)
過去ログ
Profile
小見 拓
mail@nanasi.jp
小見と申します。
神奈川でデベロッパーやってます。
名無しのVIM使い

RSS 1.0