2011年2月22日火曜日

perlでCSVファイルの読み込み。2

------------------
■概要
------------------
前回のものをText::CSV_Xを用いて書き換える。

Text::CSV_Xを使用すると、「セルの中にコンマが含まれてる場合」や「引用符""で囲まれている場合」
などのめんどくさいケースを考慮する必要がなくなる。

らしい。
------------------
■コード(全部)
------------------
use strict;
use warnings;
use Text::CSV_XS;
#-------------------------

open(FH," < team.csv");
my @list = ;
close(FH);

my $csv = new Text::CSV_XS({binary => 1}); 
my %hash;
foreach my $line( @list )
{
 $csv->parse($line) || die "parse失敗: " . $csv->error_input() . "\n";
 my ( $key, @items ) = $csv->fields();
 $hash{$key} = [@items];
} 

printarrayhash( %hash );


#-------------------------
sub printarrayhash
{
 my %hash = @_;
 foreach my $key( keys( %hash ) ) 
 {
     print "キー値 : $key\n";
     my @val = @{$hash{$key}};
     
     my $length = @val;
     print "length =$length\n";
     print "val = @val\n";
  }
}

fontを選択する

fontを選択するときに、フォントのファイル名ではなく、font名?でやりたいなぁと考えている。

InstalledFontCollectionを使うと、フォント名の一蘭がとれそうだけど、
それとフォントファイル名まではとれなそうだなぁ。

2011年2月19日土曜日

perlでCSVファイルの読み込み。

概要
CSVファイルを読み込み、それを配列のハッシュにする方法について簡単にまとめます。

よみこむファイル
住所録や名簿てきなものではなく、キーによっては要素数が変わるようなものを想定してます。

ベアーズ,山田、鈴木、佐藤、
タイガース、田中、中田、中島、トム
ライオンズ、マイケル、ジャクソン、トーマス、ディック

住所録的なものはこちらで、
http://codezine.jp/article/detail/904?p=1

コード
my %hash;
foreach my $line( @list )
{
 chomp $line; 
 my ( $key, @items ) = split( /,/, $line );
 $hash{$key} = [@items];
}

ポイント(苦労した点)は9行目と10行目です。

まずは、my ( $key, @items ) = split( /,/, $line );です。
このような書き方で、CSVの最初の文字列を$keyという変数に、
2つ目の文字列以降を配列に代入することができます。

次に、$hash{$key} = [@items];です。
これでハッシュにキーとアイテム(配列)を追加しています。
※とりあえず動いてます。

コード(全部)
use strict;
use warnings;
#-------------------------

open(FH,"  < team.csv");
my @list = ;
close(FH);


my %hash;
foreach my $line( @list )
{
 chomp $line; 
 my ( $key, @items ) = split( /,/, $line );
 $hash{$key} = [@items];
} 

printhash( %hash );


#-------------------------
sub printhash
{
 my %hash = @_;
 foreach my $key( keys( %hash ) ) 
 {
     print "キー値 : $key\n";
     my @val = @{$hash{$key}};
     
     my $length = @val;
     print "length =$length\n";
     print "val = @val\n";
  }
}


出力結果
キー値 : タイガース
length =4
val = 田中 中田 中島 トム
キー値 : ベアーズ
length =3
val = 山田 鈴木 佐藤
キー値 : ライオンズ
length =4
val = マイケル ジャクソン トーマス ディック

perl 備忘録

■連想配列
・初期化
%Hash = () ;
・値を代入
$Hash{key} = value;
■その他
・コメント
#コメントです。
・変数
$abc   # $をつけると変数となる。

・文字列
シングルクォートとダブルクォートがあり、どっちでもよいみたい。

・おまじない。
以下の文字列をファイルの先頭につけると、実行時に警告がでるようになる。やったほうがよい。
use strict;
use warnings;

2010年12月4日土曜日

C# 備忘録

#if
C言語のように#if 1をやろうとすると、コンパイルエラーとなる。
#if trueだとOKだった

LISTと配列の変換
http://www.ipentec.com/document/document.aspx?page=csharp-generics-array
ドライブの情報取得
ドライブの一覧とそのタイプなどを取得。
http://www.atmarkit.co.jp/fdotnet/dotnettips/557driveinfo/driveinfo.html
ファイル、フォルダの一覧を取得
http://www.atmarkit.co.jp/fdotnet/dotnettips/053allfiles/allfiles.html
文字列の先頭に@マーク。これなんだ?
エスケープシーケンスを無視するマーク。
http://dhive.jp/blog/yama/?p=1149

usingが関数の中にあるとき
int func()
{
  using (オブジェクト) 
  {
  }
}
のようなかたちをしているときがある。

これはオブジェクトの生存範囲を明確にしたいときに使用する。
詳しくはこちらで、
http://msdn.microsoft.com/ja-jp/library/yh598w02(v=vs.80).aspx

DataGridViewとパフォーマンス

DataGridViewに情報をセットするときに次のような感じでごりごりやってました。

// 見出しをdatagridviewに入力
foreach (string str in Columns)
{
    dataGridView1.Columns.Add(str, str);
}

// 中身を入力 (行を繰り返し入力していく。)
int nColmn = 0;
Dictionary dict;
dict = cdate.GetData();
foreach (string key in dict.Keys)
{
    // 文字列をgridviewに登録。
    string[] strtmp = new string[dict[key].Length];
    for ( int i = 0; i < dict[key].Length; i++)
    {
        strtmp[i] = dict[key][i].str;
    }
    dataGridView1.Rows.Add(strtmp);
}


ですが、データの行数が2万ぐらいになったら、めちゃくちゃおそくなってしまい。。。
なので、DataTableにデータをつくっておいて、その後DataGridViewのDatasourceとして
登録するようにしたらだいぶよくなりました。

// 見出しをdatagridviewに入力 
DataTable dt = new DataTable();
foreach (string str in Columns)
{
    dt.Columns.Add(str, str.GetType());
}

// 中身を入力 (行を繰り返し入力していく。)
int nColmn = 0;
Dictionary dict;
dict = cdate.GetData();
foreach (string key in dict.Keys)
{
    // 文字列をgridviewに登録。 
    string[] strtmp = new string[dict[key].Length];
    for (int i = 0; i < dict[key].Length; i++)
    {
        strtmp[i] = dict[key][i].str;
    }
    dt.Rows.Add(strtmp);
}
dataGridView1.DataSource = dt;

2010年11月7日日曜日

とりあえず。

フォントファイルの情報表示ソフトは、ひとまずこんな感じになってます。
まだ、簡単なテーブルしかやってないのですが。

グリフとかをちゃんと表示させれる気がしないので、
途中で挫折する可能性は高いです。