2012年12月2日日曜日

CSVファイルを2次元配列に読み込むperlサンプル


自動販売機の在庫管理を例としてCSVファイルを2次元配列に読み込むperlサンプルです。
まずは行ごとに1次元配列(@csv_array)に読み込み、各行の要素は一度(@line)配列に保持し、
split関数を使用して2次元配列(@line_data)に読み込んでいます。

配列に読み込んだ後の処理は適当です。

配列をCSVファイルに出力する準備として2次元配列(@line_data)をjoin関数を使用して
カンマ区切りの要素とした1次元配列(@line_consolidate)に整形した後に
CSVファイルに出力しています。

■構成情報
・OS: Amazon Linux AMI release 2012.09(64bit)
・Perl: 5.10.1


■読み込むCSVファイル(goods.csv)
商品名,価格,在庫 ファンタ,100,28 キリンレモン,110,24 ポカリスエット,150,31 十六茶,130,18 アクエリアス,140,26 午後の紅茶,160,17 伊右衛門,140,19

■Perlプログラム(inoutcsv.pl)
#!/usr/bin/perl # csvファイルの内容を配列に読み込み、 # 配列の内容をcsvファイルに出力するサンプル ### 読み込みファイル $INPUT = "./goods.csv"; ### 出力ファイル $OUTPUT = "./goods.csv"; ### 配列の中身を初期化 my @csv_array = (); my @line = (); my @line_data = (); my @line_consolidate = (); ### csvファイルの中身を配列に読み込む open (FH, "$INPUT") or die "$!"; @csv_array = ; close (FH); # 要素を各配列に格納 print "要素を配列に格納\n"; print "----------------------\n"; my $i = 0; while ($i <= $#csv_array) { chomp ($csv_array[$i]); @line = split (/,/, $csv_array[$i]); my $j = 0; while ($j <= $#line) { $line_data[$i][$j] = $line[$j]; print "$i行$j番目の要素: $line_data[$i][$j]\n"; $j ++; } $i ++; } print "----------------------\n\n"; ### 商品購入処理 # 何らかの処理がされないと面白くないのでランダムに在庫を減らしています。 # 1行目はヘッダ行なので出力されないように制御。 my $dec = int(rand($#csv_array -1)) + 1; $line_data[$dec][2] = $line_data[$dec][2] -1; print "処理対象行: $dec $line_data[$dec][0]の在庫更新: $line_data[$dec][2]\n\n"; ### csvファイル出力用に配列を整形 print "csvに出力する内容を確認\n"; print "----------------------\n"; $i = 0; while ($i <= $#csv_array) { $line_consolidate[$i] = join(',', @{$line_data[$i]}) . "\n"; print "$line_consolidate[$i]"; $i ++; } print "----------------------\n"; # 配列をファイルへ出力 open (FH, ">$OUTPUT") or die "$!"; print FH @line_consolidate; close (FH); #// 終了 exit(0);

■実行結果確認
$ ./inoutcsv.pl 要素を配列に格納 ---------------------- 0行0番目の要素: 商品名 0行1番目の要素: 価格 0行2番目の要素: 在庫 1行0番目の要素: ファンタ 1行1番目の要素: 100 1行2番目の要素: 28 2行0番目の要素: キリンレモン 2行1番目の要素: 110 2行2番目の要素: 24 3行0番目の要素: ポカリスエット 3行1番目の要素: 150 3行2番目の要素: 31 4行0番目の要素: 十六茶 4行1番目の要素: 130 4行2番目の要素: 18 5行0番目の要素: アクエリアス 5行1番目の要素: 140 5行2番目の要素: 26 6行0番目の要素: 午後の紅茶 6行1番目の要素: 160 6行2番目の要素: 17 7行0番目の要素: 伊右衛門 7行1番目の要素: 140 7行2番目の要素: 19 ---------------------- 処理対象行: 5 アクエリアスの在庫更新: 25 csvに出力する内容を確認 ---------------------- 商品名,価格,在庫 ファンタ,100,28 キリンレモン,110,24 ポカリスエット,150,31 十六茶,130,18 アクエリアス,140,25 午後の紅茶,160,17 伊右衛門,140,19 ----------------------

■出力されたCSVファイル(goods.csv)を確認
$ cat goods.csv 商品名,価格,在庫 ファンタ,100,28 キリンレモン,110,24 ポカリスエット,150,31 十六茶,130,18 アクエリアス,140,25 午後の紅茶,160,17 伊右衛門,140,19
※アクエリアスの在庫が26→25に更新されCSVファイルに出力された。

0 件のコメント:

コメントを投稿