2011年2月24日木曜日

PDFのぺーじのサイズを変更する2

ようやく着手しました。C#で作り始めました。
UIはこんな感じ。

コンボボックスに用紙サイズを登録する部分で
サイズをひとつづつ追加してたらとてもパフォーマンスが悪くなってしまいました。

以下のような変更ではやくなったので、メモ。

コントロールへの項目の追加にはaddrange()を使用すべきという
記述がこちらにあったので、まずはそれを実施。
http://msdn.microsoft.com/ja-jp/magazine/ee221437.aspx

for文のなかで配列を作って、最後にコンボボックスにaddrange()で代入。という風に作り変えてみたがあまり変化がなかった。

その後、コレクションを配列に変換できることがわかり、そのように手直ししたところ
パフォーマンス的な問題はなくなった。for文もなくなりとてもすっきり。

■変更前のソース
PaperSize pkSize;
for (int i = 0; i < printDoc.PrinterSettings.PaperSizes.Count; i++ )
{
    pkSize = printDoc.PrinterSettings.PaperSizes[i];
    comboPaperSize.Items.Add(pkSize);
}
■変更後のソース
PaperSize[] pkSizearr = new PaperSize[printDoc.PrinterSettings.PaperSizes.Count];
printDoc.PrinterSettings.PaperSizes.CopyTo(pkSizearr, 0);
comboPaperSize.Items.AddRange(pkSizearr);
★ついでにコレクションから配列に変換する方法もわかったので、メモ
コレクション.CopyTo(配列, 0)

0は何番目からコピーするかをしていする。

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;