• ベストアンサー

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;

  • backs
  • お礼率85% (564/660)

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

  • ベストアンサー
  • gaku1
  • ベストアンサー率71% (10/14)
回答No.3

No.1です。 例の「12」よりも後ろにある改行等は前処理が必要ですが,次のようにすれば,途中にある連続したスペース,行頭スペース,行末スペースはきにしなくて良さそうです。 No.1をすこし変えて, for(var i in rows){//ここまでは同じ  dat.push(rows[i].match(/¥d+/g)); } 以上

backs
質問者

お礼

度々の回答ありがとうございました。各スペースのことを気にしなくても良くなったのでとても使い勝手がよくなりました

その他の回答 (2)

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT_JIS"> <script language="JavaScript"><!-- var dat = []; window.onload=function(){ var ta=document.getElementById("DATA"); var rows=ta.value.split("\n"); for(var i=0;i<rows.length;i++){ dat.push(rows[i].split(",")); } //点検 for(var i=0;i<dat.length;i++) for(var j=0;j<dat[i].length;j++) alert(dat[i][j]); } //--> </script> <title>テキストエリアのデータを配列に格納</title> </head> <body> <textarea ID="DATA" cols="20" rows="10">1,2,3,4 5,6,7,8 9,10,11,12</textarea> </body> </html>

backs
質問者

お礼

早速の回答ありがとうございました。わざわざ一通り書いていくだすってとてもありがたいです。

  • gaku1
  • ベストアンサー率71% (10/14)
回答No.1

例示されたデータの通りで(数値を区切るスペースは1個),最後の「12」の後ろに改行が入っていないとすると, var str=document.フォームの名前.テキストエリアの名前.value; var dat=new Array(); var rows=str.split("¥n"); for(var i in rows){  dat.push(new Array());  var cols=rows[i].split(" ");  for(var j in cols){   dat[i].push(cols[j]);  } } 以上で,二次元配列datに格納されます(やってみたら格納されました。上はところどころ全角文字が混ざっていますが,半角になおしてください)。 Perlの実例で示されているような「chomp」に相当するものがJavaScriptには用意されていないと思うので,「データをきれいにする(不要な改行や連続したスペース,行頭,行末のスペースなどを取り除く)」は,自分で実装する必要があろうかと思います。

関連するQ&A

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

    ---ここから--- 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次配列の形にでもできれば最高なのですが、、、

    • ベストアンサー
    • Perl
  • ファイルの読み込み時に場所を指定する

    #ファイルの読み込み $pathname="C://Perl/datafile/anovaCR.dat"; open MYFILE, "$pathname"; while (<MYFILE>) { chomp; @{"dat$."} = split /\t/; } $rows=$.; close MYFILE; といったように,コード中に既にデータが入力されたファイルを指定しているのですが,プログラムを実行した時に(Windowsなので)コマンドプロントの画面に 「ファイルの場所を指定してください。」 などと表示し,コマンドプロント上で C://Perl/datafile/anovaCR.dat と指定して読み込ませることは可能でしょうか。もちろん,可能は可能でしょうが「初心者には荷が重過ぎて無理」ではないかということです。手持ちの書籍には載っていませんし,webをどのように検索すればよいかもよく分かりません。

    • ベストアンサー
    • Perl
  • csvファイルを統合する

    あるディレクトリにtest1.txtとtest2.txtというカンマ区切り(拡張子はcsvではないですけど)があったとして、それらのファイルを1行ずつ読み込み、それを追加書き出しで1つのファイルに収めていこうとしています。 そこで以下のようなコードを書いてみたのですが、どうやらtest1.txtしか読み込んで書き出せていないようなのです。その原因が分からずに困っています。 $dir = 'C:/Perl/workdir'; # 対象ディレクトリ名 open MYHANDLE, ">>out.txt"; # 追加書き出しモードでファイルハンドルをオープン opendir DH, $dir or die "$dir:$!"; # ディレクトリを開く while ($file = readdir DH) { # ディレクトリにあるファイル名を取得し、$fileに格納 next if $file =~ /^\.{1,2}$/; # '.'や'..'も取れるので、スキップする open MYFILE, "$file"; # 取得したファイルを開く while (<MYFILE>) { chomp; @dat = split /,/; # 読み込むファイルは「カンマ区切り」としてレコードを読み込む。 $n = @dat; for($i=0; $i<$n; $i++){ print MYHANDLE $dat[$i]; # ファイルに追加書き出し(ファイルがなければ新規作成される) print MYHANDLE ","; # カンマ区切りで書き出していく } print MYHANDLE "\n"; # 1行読み終えるごとに改行 } close MYFILE; # i番目のファイルを読み終えたら閉じる print $file, "\n"; # 読み込み・書き出しをしたファイル名を表示する } closedir DH; close MYHANDLE;

    • ベストアンサー
    • Perl
  • 連想配列で時間短縮したい

    aaa.txt 06011800, 5.3 06012100, 5 06020000, 4.5 06020300, 6.2 … bbb.txt 06011800, 5.1 06012100, 7.5 06020000, 5.1 06020300, 9.3 … という二つのファイルがあります。 以下のプログラムを用いて、 06011800, 5.3, 5.1 06012100, 5, 7.5 06020000, 4.5, 5.1 06020300, 6.2, 9.3 … といった感じでデータを作る事に成功したのですが、どうしてもループに無駄が多く、時間がかかってしまいます。 連想配列などを使えば時間が短縮出来そうなのですが、よくわかりません。 ご教示いただけないでしょうか。 以下、作成したプログラム。 $csvfile1 = $ARGV[0]; $csvfile2 = $ARGV[1]; open(DAT1, $csvfile1) || die $!; while($line=<DAT1>) { chomp($line); @dat = split(/,/,$line); open(DAT2, $csvfile2) || die $!; while($line2=<DAT2>) { chomp($line2); @dat2 = split(/,/,$line2); if($dat[0] == $dat2[0]){ print "$dat[0],$dat[1],$dat2[1]\n"; } } } close(DAT);

    • ベストアンサー
    • Perl
  • データの抽出、配列操作で教えて下さい。

    こんばんは、お世話になります。 配列操作で教えて頂きたく。 次のデータを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
  • csvの内容を配列に入れて個別に変数をつける

    はじめまして、お世話になります。 内容はdata.csvを開いて$a1の値が、ban1の時に、 該当の一行を読み出して、カンマ区切りでわかれている順番に、 $a1 $a2 $a3という変数に代入して他のプログラム内で、利用できればと思いますが、 思うように値が取得できません。 下記、参考サイトなどを見ながら、 動作の部分をかいてみました。 まだ理解が浅く、見当はずれな指示があるかもしれませんが、 ご参照いただき具体的な、 ご指摘をいただければと思います。 よろしくお願いいたします。 my $dataFile = 'data.csv'; open FH,"<$dataFile" or error_msg("データファイルが開けません : $!"); flock(FH, LOCK_EX); while(<FH>){ chomp(); my@dummy = split(/,/,$_); if($a1 == $ban1) { $hoge = $_; last; } chop $hoge; ($a1,$a2,$a3,$a4,$a5,$a6,$a7,$a8,$a9,$a10,$a11) = split(/,/); } flock(FH, LOCK_NB); close FH;

  • CSVデータの編集の際の重複チェックの方法

    今、data.csv(カンマ区切り)として、左から順位、名前、性別という3項目で、10人程度のリストデータがあります。 data.csv(カンマ区切り)を編集するようにしていますが、順位は重複してはならないので、重複していたらエラーを出したいのですが。。。 ($rank,$name,$sex) = split(/\,/,$line); です。 open(IN,"$logfile") || &error("ファイルが開けません"); @lines = <IN>; close(IN); # 情報の書換え foreach $line (@lines) { ($rank,$name,$sex) = split(/\,/,$line); $line = "$in{'rank'},$name,$sex\n";} push(@new,$line); } # ファイルを更新 open(OUT,">$logfile") || &error("ファイルが開けません"); print OUT @new; close(OUT);

  • エクセル2003 string型のデーターの所定文字数の数の取得

    いつもアドバイス頂きありがとうございます。 今回、質問させていただきたいのは、 string型でデーターを取得した文字列に対して ある文字の文字数がいくつ在るかを取得したいのですが VBA関数で、そのような関数はあるのでしょうか? 例  myDataにstring型の文字列を取得してあります。 その中に「,」(カンマ)が何個存在するかと言う事 を取得したい。 やりたい事として、mydata()の中に2次元配列要素となるデーターを 1次元で仮格納してあり、それをセルに書き出すために2次元 に格納(splitで再格納)しなおしているのですが、データーが変わる たびに、カンマの数を数えて配列宣言を記入するのが面倒なので、 カンマの数がいくつでも、2次元に再格納できるようにしたいためで す。 宜しくお願いいたします。

  • 区切りファイルの列ソートについて

    僭越ながら、質問させていただきます。 タブ記号で区切られたTSVファイルというものを扱っているのですが、まずtest.tsvファイルを配列に格納して、そこから2列目の値すべてを降順にソートし、 (列をソートした結果の行は、ちゃんと最初のまま保持され、バラけずに出力されるようにしたい) その結果をresult.txtに表示させるプログラムを作りたいと思っております。 ですが、自分が書いたプログラムではまったく動かず、どこが悪いのかも情けないことにわかりません…。  かれこれ何時間も悩んでいますが、まったく方策が見出せません。どこをどう直せばいいのか、ヒントだけでも構いませんので、教えてくださいませんでしょうか。 プログラムは以下です。 #!/usr/bin/perl use strict; use warnings; use Fatal qw/ open /; my @values; my $tsv_file = "test.tsv"; my @tsv = &readtsvfile($tsv_file); @values = sort { $a->[1] cmp $b->[1] } @tsv; open(DATAFILE, '>>result.txt') or die("error :$!"); foreach(@tsv){ print DATAFILE; } sub readtsvfile { open(IN, $_[0]); while(<IN>) { chomp; push @tsv, [ split(/\t/) ]; } close(IN); return @tsv; } close DATAFILE; このプログラムの手直しでも新しい方法でもなんでも構いません、何か教えてくだされば、本当にありがたいです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • c# 配列の受け取り方

    こんにちは、 c#言語で、RETURNの返しが配列の場合 どのように疎ければよいのでしょうか? メイン処理 strmtcにrun_mainから帰ってくる配列を格納したい string[] strmtc = run_main(""); run_main処理 // カンマ区切りで分割して配列に格納する string[] sarray; sarray = s.Split(','); return sarray;

専門家に質問してみよう