データを配列へ代入する方法とは?

このQ&Aのポイント
  • データを配列に格納する方法について質問されています。
  • 現在の方法では1つの配列に1行のデータを繰り返し入れているそうです。
  • 行ごとに別々の配列に代入できないか、もしくは2次配列の形にする方法が知りたいです。
回答を見る
  • ベストアンサー

読み込んだデータを配列へ代入する方法

---ここから--- 1,2 3,4 ---ここまで--- このようなファイルを読み込んでデータを配列へ格納するには, $pathname="D://data.txt"; open MYFILE, "$pathname"; @list=<MYFILE>; for($i=0;$i<2;$i++){ @dat=split(/,/,$list[$i]); print @dat; } close MYFILE; といったようなforあるいはwhileで1つの配列(上の場合だと@dat)に1行のデータを繰り返し入れていく方法しか思い浮かびません。できれば1行目のデータは@dat1という配列へ,2行目のデータは@dat2という配列へ,といったように行ごとに別々の配列へ代入させたいのですが良い方法はないでしょうか。 もしくは@dat=([1,2],[3,4])のような2次配列の形にでもできれば最高なのですが、、、

  • backs
  • お礼率85% (564/660)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • moon_piyo
  • ベストアンサー率60% (88/146)
回答No.1

こんちは # @dat1=(1,2);@dat2=(3,4)の場合 open MYFILE, "$pathname"; while (<MYFILE>) { chmop; @{"dat$."} = split /,/; } close MYFILE; # @dat = ([1,2],[3,4])の場合 open MYFILE, "$pathname"; @dat = map {chomp;[split /,/]} <MYFILE>; close MYFILE;

backs
質問者

お礼

早速の回答ありがとうございました。 なるほどmap関数を利用すれば多次元配列の形にできたのですね。

関連するQ&A

  • textareaに入力されたデータを読み込む

    例えば以下のようにtextarea内にデータが入力されているとします(カンマ区切り,スペース区切り,タブ区切りなどはなんでも良いのですが)。 +---ここから---+ 1 2 3 4 5 6 7 8 9 10 11 12 +---ここまで---+ これらのデータを配列に格納する方法が,だいぶネットサーフィンしていたのですが分かりません。 以降,Perlになってしまうのですが,1行ずつ配列にdat=(1,2,3,4)のように格納していくか,あるいは行列(2次配列)の形で格納したいのです。 $pathname="D://datafile.dat"; open MYFILE, "$pathname"; while (<MYFILE>) { chomp; @{"dat$."} = split /,/; } close MYFILE; +----------- $pathname="D://datafile.dat"; open MYFILE, "$pathname"; @dat = map {chomp;[split /,/]} <MYFILE>; close MYFILE;

  • データの抽出、配列操作で教えて下さい。

    こんばんは、お世話になります。 配列操作で教えて頂きたく。 次のデータをuser.datとします。 1<>yamada<>99999<> 2<>tanaka<>22222<> 3<>suzuki<>10101<> 4<>yamada<>12345<> 5<>yamada<>55555<> user.datの中からyamadaの行だけ取り出して 3番目の数字データでソート表示したいのですが なかなかうまくいきません。 open(F,"user.dat"); @load_txt = <F>; close(F); foreach $data (@load_txt){ if((split(/<>/,$data)[2]) eq "$usid"){push(@txt_lines,$data);} } @txt_lines = sort{(split(/<>/,$a))[2] <=> (split(/<>/,$b))[2]}@txt_lines; 上記でおかしな所ありましたらご教示頂きたく 宜しくお願いします。

    • ベストアンサー
    • Perl
  • [arduino]数値の大きなデータを二次配列へ

    シリアル通信で得たデータを二次元配列へ格納するために、 以前では、 if(Serial.available()>120){ for(int k=0;k<8;k++){ for(int l=0;l<15;l++){ //読み込んだ値を配列に代入 matrix[k][l]=Serial.read(); } } } このようなやり方で読み込んだ値を二次元配列に代入していたのですが、 128個以上のデータを扱いたい場合、Serial.availableでは保持できず、困っています。 方法として、 (1)一つずつデータを読み込み、128回ループを繰り返し配列に貯めていく。その後配列を2次元配列に代入する。 (2)一つデータを読みこんだら二次元配列の1行目1列目のドットに格納、もう一つデータを読みこんだら二次元配列の1行目2列目のドットに格納…というように、 読みこんだデータをそのまま二次元配列のそれぞれの場所へ格納していく。 というような二つの方法を思いついたのですが、 (1)の方法では、配列にデータを貯蓄していくコードをこのように↓書いたのですがうまくいかず、 for(int i=0;i<128;i++){ if(Serial.available()>0){ data[128] = Serial.read(); } } (2)の方法では、データを二次元配列のそれぞれの場所へ格納していく指定方法が分かりませんでした。 正しい書き方や、良いアイデアをお持ちの方がいましたら、是非御教授お願いします。

  • C# 配列の配列(多次元配列?)

    C#において、配列の配列中に格納した値を、検索することを 行いたいのですが、格納した値そのものを見ることができません。 まだ、C#を始めて間もないので、配列に格納する時点で、 不備があるかも知れませんが、お願いします。 やりたいこと ・テキストファイル内にある値を、2次元配列または、多次元配列に格納 ・配列に格納した値で、データチェックなどを行う予定  テキストファイル内のデータは、下記内容となり要素数も固定ではなく変動する   A=1,2,3・・・   B=11,22,33・・・ 実際のソースは、 //配列 ArrayList list = new ArrayList(); //配列格納 1レコード毎用 ArrayList listtmp = new ArrayList(); while ((strGenderTextLine = objReader.ReadLine()) != null) {  string strBuffer;  //「=」前の値格納用変数  string[] strBuffer2; //「=」後の値格納用配列  listtmp=null;  //strtmpに「=」前の値を格納  strtmp = TextLine.Split('=').GetValue(0).ToString();  //strtmp2に「=」後の値を格納(配列)  strtmp2 = TextLine.Split('=').GetValue(1).ToString().Split(',');  for (int i = 0; i <= strtmp2.Length - 1; i ++)  {   //[i,0]に、「=」前の値を代入   if (i == 0)   {   listtmp.Add(strtmp);   }   else   {   listtmp.Add(strtmp2[i].ToString());   }  }  //list配列にlistTmp配列を格納(配列の配列)  list.Add(listtmp);  intT = intT + strtmp2.Length;  //行数カウント  intTLine = intTLine + 1;  } ここから、配列「list」内に入っている値を閲覧することができる方法を教えていただければと思います。 宜しくお願いいたします。

  • 配列にないデータのみを代入する方法

    シェルスクリプトで重複するデータのない配列を作りたいのですが、配列に含まれていないデータのみを代入する、もしくは、代入したとしても配列内のデータの重複を取り除く方法を教えてください。 よろしくお願いいたします。

  • 連想配列の配列の使い方

    C言語でいうところの構造体の配列(要素は"hoge"と"fuga"のみ)を perlで表現する場合、連想配列の配列にするのが一般的でしょうか? 以下の様なソースコードなのですが、perlらしさが失われている気がします。 perlらしく書くとしたらどう書くのが良いでしょうか? [ソース] @list; #この配列の要素に連想配列を入れる sub input{ #list.txtの中にはhogeとfugaの値がカンマ区切りで記入されている open(IN, "list.txt");  $i = 0; while ($xx = <IN>) { ($list[$i]{"hoge"}, $list[$i]{"fuga"}) = split /,/, $xx; $i++; } close(IN); } sub output{ for($i = 0; $i <= $#list; $i++){ print $list[$i]{"hoge"}, $list[$i]{"fuga"}; } }

    • ベストアンサー
    • Perl
  • listで変数代入

    あらかじめ、データ行のデータ数がわかっていれば、listで変数へ代入してあげれば問題ないと思いますが、データによってはデータ行のデータ数が10個とかそれ以上になると、その分だけlist($data_○.......................)とすると面倒なので、簡単に行のデータ数をカウントしてlist関数を使った方法で処理する方法はないのでしょうか? $data_01とかアンダーバー末尾数字みたいな方法でlist($data_01,$data_02,$data_03,,,,,,,,,,,,,,,,,,,,,)として変数に代入したいで教えて下さい。 sample.csv りんご1,ばなな1,いちご1 りんご2,ばなな2,いちご2 りんご3,ばなな3,いちご3 define(csvdata, "sample.csv"); $data = file(csvdata); for ($i = 0; $i < count($data); $i++) { list($data1,$data2,$data3) = split(",", $data[$i]);

    • ベストアンサー
    • PHP
  • 配列 代入

    JavaScript初心者です。 配列の代入で困っています。 var nums=new Array(); for(var i=0;i<3;i++){ nums[i]=i; // ☆ } // nums [0,1,2] ☆の行(コード)をnums.push=i; とするとnumsに2しか入っていないのですが、どういう仕組みでしょうか? よろしくお願いします。

  • 配列入れ替えの効率的方法は

    VBでグローバル変数配列を3000とっています。 格納されているデータを、1つづつずらして代入し直しをやりたいのですが 配列添え字1のデータを配列添え字0にというふうに3000回のループで 処理する以外に良い方法はないでしょうか 例 for i=0 to 2999 a[i]=a[i+1]

  • 配列で呼び出しMCやボタンにしたい

    いつもお世話になっております。 以前配列の処理の仕方について投稿させて頂きました。 http://okwave.jp/qa3709770.html FLASH8、AS2.0です。 こちらを参考に // 外部データがロードされたときの動作定義 myload.onData = function(moji) { // 外部データを 「,」 でsplit した要素の配列を作成 myArray = moji.split(","); // 配列の要素数を取得 mylen = myArray.length; // 要素数分のテキストフィールドの作成と値の代入 for (i=0; i<mylen; i++) { // テキストフィールドを作成 _root.createTextField("my_txt"+i, i, 20, i*30+20, 100, 22); // (見えるようにテキストフィールドの枠線を入れておきます) _root["my_txt"+i].border = true; // テキストフィールド別に配列の各要素を代入 _root["my_txt"+i].text = myArray[i]; } }; // 外部データのロード myload.load("外部読みこみのパス"); と、おかげさまで ->外部読みこみ ->内容を配列に格納 ->配列を元にテキストフィールドを作成 ここまで実現できたのですが、その次に、 そのテキストフィールド自体をボタンにしたいのですが、 (ボタン自体移動させたいのでMCにしてmouseDown予定です) どの様にしたら良いのでしょうか? 例えば、1個づつMCを作り、 その中にテキストフィールドを1個づつ格納する という、イメージを描いています。 myload.onData = function(moji) { myArray = moji.split(","); mylen = myArray.length; for (i=0; i<mylen; i++) { _root.createEmptyMovieClip("field"+i, i); _root.field+icreateTextField("my_txt"+i, i, 20, i*30+20, 100, 22); _root["my_txt"+i].border = true; _root["my_txt"+i].text = myArray[i]; } }; 例えばこんな感じでルート直下にfield+iのMCを作成し、 そのMCの中にテキストフィールドを格納する(1個づつ) というのを、試みたのですがMC自体が空で読めませんでした。 (テキストフィールドとMCの深度が重複している?) 補足要求等あればお願い致します。

    • ベストアンサー
    • Flash