• ベストアンサー

CSVから値の割り出し

CSVファイルの1行目を渡された引数から値を割り出し、配列(@x)に 格納して、2行目以降も1行目で評価された要素と同じ位置の要素を 別配列(@y,@z)に入れて、渡された複数の引数をもとに下記のように 評価したいのですが可能ですか? 例)CSVファイル:1レコード目:1,1,1,2,2,2,3,3,3        2レコード目:1,2,3,4,5,6,7,8,9        3レコード目:A,B,C,D,E,F,G,H,I 引数:2,3,1なら 結果:2,6,D   @x=2,2,2 @y=4,5,6 @z=D,E,F

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2の補足を読んでちょっとしたサンプルを作ってみました。 ---------------------------------------------------------------- #make_select は、 #make_select(検索値, 配列) の様に呼び出して、 #マッチした位置のデータを選択するような関数を返す sub make_select ($@){ my ($para, @data) = @_; my @pos=(); my $i,$len=@data; for($i=0;$i<$len;$i++){ push @pos, $i if $data[$i] eq $para; } return sub { my ($data, $select) = @_; foreach(@pos){ push @$select, $data->[$_]; } }; } #元のデータ my @x = (1,1,1,2,2,2,3,3,3); my @y = (1,2,3,4,5,6,7,8,9); my @z = qw(A B C D E F G H I); #セレクトする関数を作る my $select=make_select(1, @x); #格納先配列 my @xx=(); my @yy=(); my @zz=(); #&$select(元データの配列のリファレンス, 格納先配列のリファレンス) &$select(\@x, \@xx); &$select(\@y, \@yy); &$select(\@z, \@zz); #結果の表示 print join(",", @xx) . "\n"; print join(",", @yy) . "\n"; print join(",", @zz) . "\n";

polalis
質問者

お礼

BLUEPIXY様、 仕事が遅くなり返事が遅れてスミマセン。 私のつたない説明で、こんなサンプルまで作って頂いて 本当にありがとうございました。 私もPerlを勉強中の身なので、サンプルコードを良く噛み 砕いて勉強させていただきます。 自分で調べても、わからないことや疑問点が沸いてきたら またBLUEPIXY様にお聞きするかもしれませんが、そのときは どうぞよろしくお願い致します。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1の方と同じような質問になりますが、#1の補足を読んでも意味がわかりません。 引数:2,3,1の意味は、 2の要素の始まる位置から3つの要素で1を除くとか 2の要素の始まる位置から3の要素の始まる1つ前の位置までの要素 とか そういう(つまり渡されるパラメータの)意味が知りたいのですが

polalis
質問者

お礼

やりたいことが説明しきれておらず、理解が苦しいですよね? すみません…。 スクリプト自体は、サブルーチンとして使用するのですが、 メインのスクリプトはアンケートになっていて、すべての設問を終えるとパラメータ(引数)がPOSTされます。 例)1,3,2,3,2…(分解後) パラメータの意味は、「Q1」に対して「1」を答えたみたいな感じです。 それに対して、このスクリプトでCSVファイルから画面IDのような ものを算出しようと思っています。(行:設問数,列:戻り値) 質問1 まずパラメータをもとにCSVファイルの1行目から、ヒットされた値の要素を全て切り出して配列に格納したいのですが可能ですか? 質問2 上記1行目の評価から、2行目以降も同じ位置の要素を別の配列に格納したいのですが、可能ですか? ※@x…CSVファイルの1行目、@y…2行目、@z…3行目の値が入っています。 例) @xは「1,1,1,1,2,2,2,2,3,3,3,3」でパラメータが「1」なら「1,1,1,1」の部分(@x[0]..[3])を抜き出して配列@xxへ格納。 そのまま渡された値「1」を返す。 (パラメータが「2」なら「2,2,2,2」部分(@x[4]..[7])を抜き出す。) 2行目以降は、評価せずに@y[0]..[3]または@x[4]..[7]の要素を@yyに格納する。 それから評価して、第2パラメータが「3」なら、@yyの3番目の要素(@yy[2])を返す。 結果的には、1行目で要素の範囲を絞って2行目以降から、絞った列で値を返したいということなんですが、ご教授願えませんか?

noname#96023
noname#96023
回答No.1

たいした事していないのでできると思いますが アルゴリズムが理解できないです >1行目を渡された引数から値を割り出し、配列(@x)に 格納して これって何をやっているの?

polalis
質問者

お礼

説明が下手ですみません。 アンケートの結果IDをCSVから割り出そうとしています。 ローカルのテストでDOS窓のperlコマンドからパラメータを5~6個程 引き渡して、CSVファイルの該当箇所を割り出そうと思っています。

関連するQ&A