• ベストアンサー

javascriptかCGIでCSVの最小値

こんにちは。超初心者です。 サーバー上にあるcsvデータの最小値を求める方法が分かりません。 例えば、 【kagaku.csv】 年,考査,太郎,花子,つとむ 2009,期末,56,88,95 2010,中間,97,90,40 2010,期末,55,49,61 2011,中間,70,80,63 上記のようなcsvデータの「太郎」「花子」「つとむ」の最小値をブラウザで表示したいのです。 結果として、 太郎 55、花子 49、つとむ 40 のような表示が望ましいです。 出来たらjabascript、不可能ならCGIでの方法(コード記述)をご教授ください。 よろしくお願いいたします。

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

  • ベストアンサー
回答No.9

Ajax ではありませんが、どうでしょう? XMLHttpRequest が使えるブラウザで動かしてください。 -- > 専門の方でも少し面倒な作業が必要 私は、javascript だけ解答しているので「専門(?)」かもしれませんが、プロではありません。 それに面倒だと思ってもいません。それを見せるのがちょっと恥ずかしいだけ。 <!DOCTYPE html> <title>TEST</title> <body> <script> if(!Array.prototype.map)Array.prototype.map=function(b,e){var c=this.length;if(typeof b!="function")throw new TypeError;for(var d=Array(c),a=0;a<c;a++)a in this&&(d[a]=b.call(e,this[a],a,this));return d}; if(!Array.prototype.reduce)Array.prototype.reduce=function(d){var c=this.length;if(typeof d!="function")throw new TypeError;if(c==0&&arguments.length==1)throw new TypeError;var a=0;if(arguments.length>=2)var b=arguments[1];else{do{if(a in this){b=this[a++];break}if(++a>=c)throw new TypeError;}while(1)}for(;a<c;a++)a in this&&(b=d.call(null,b,this[a],a,this));return b}; var A =  (function (text) {   return text.split (/\r\n|\r|\n/g)         .reduce (          (function (a, b) {           return a.concat ([b.split (/\s*[,\t]\s*/)]);          }), []);  }); var B =  (function (ary) {   return ary.reduce (function (a, b) {           return b.map (function (c, i) {             return (isNaN (c))                ? this[i]                : (isNaN (this[i]))                 ? Number (c)                 : Math.min (Number (c), this[i])            }, a);          },          []);  }); var C =  (function (a) {   return this[a];  }); var D =  (function (s, e) {   var result = [];   while (s < e)    result.push (s++);   return result;  }); var E =  (function (file) {   var text = null;   var req = new XMLHttpRequest;   if (req) {    req.open ('GET', file, false);    req.send (null);    text = (200 == req.status)       ? req.responseText       : 'Error';    req = null;   }   return text;  }); var a = A (E('test.csv')); //←ここに指定ファイル var b = B (a); var c = D (2, a[0].length); // 3列目から最後まで var d = [  c.map (C, a[0]),  c.map (C, b) ]; alert(d.join ("\n")); </script>

hiron0102
質問者

お礼

すごいです!ちゃんと表示されました!! こんな素人にお付き合い下さり、ありがとうございました。 これを機にコードの意味をもっと理解し、がんばって勉強したいと思います(^-^)/

その他の回答 (8)

回答No.8

#2です。 No1の方がおっしゃていたように、「Ajaxでファイルを読み込む」処理が必要です。 ガリガリ誰かが書いてくれると期待しています。

hiron0102
質問者

お礼

やはり、専門の方でも少し面倒な作業が必要なんですね(;_;) ちょっと超初心者の私にはハードルが高いみたいです。。。 でも、もう少し頑張ってみます! (他の方の回答も期待しながら…) アドバイスありがとうございました!

回答No.7

#2です それにデータを追加して試してみましたか?

hiron0102
質問者

お礼

はい! 下記の例では答えが変化しないので 【2012,期末,20,10,15】をCSVファイルに追記しましたが答えは変わりませんでした。 しかしながら、コードに追記したら表示されました。 ということは、やはり何かCSVファイルを読み込む記述をしなければなりませんよね。。。

回答No.6

#2です。 >CSVの中身が変わってしまうとその都度書き換えなければならない どのへんを見てそう思われたのですか?

hiron0102
質問者

お礼

var CSV_text = "年,考査,太郎,花子,つとむ\n2009,期末,56,88,95\n2010,中間,97,90,40\n2010,期末,55,49,61\n2011,中間,70,80,63"; です。 ち、違うのですか!??(汗

回答No.5

#2です CSVが、どのように変化しますか?具体的にお願い致します。最小値の計算はできています。 後は、どれをどう表示するかだけなのですが・・・

hiron0102
質問者

お礼

早々のお返事ありがとうございます! CSVは入力フォームによって上書きされていきます。 項目の【年,考査,太郎,花子,つとむ】は変わりません。 その下の行が増えていくだけです。 例えば、【2012,期末,99,88,77】が追加されるといった感じです。

回答No.4

whileの中反復すんの忘れてた <?php echo(array_slice(csv_get_min_data(CSVファイル),2)); function csv_get_min_data($path){ $rtn=array(); $csv=fopen($path,'r'); $labels=fgetcsv($csv); $len=count($labels); $row=fgetcsv($csv); for($i=0;$i<$len;$i++){ $rtn[$labels[$i]]=$row[$i]; } while($row=fgetcsv($csv)){ for($i=0;$i<$len;$i++){ if($rtn[$labels[$i]]>$row[i]){ $rtn[$labels[$i]]=$row[i]; } } } return $rtn; } ?>

hiron0102
質問者

お礼

わざわざ訂正ありがとうございます!

回答No.3

楽なのはCSV読み込みのメソッドが用意されてる PHPだと思うのでPHPの場合も <?php echo(array_slice(csv_get_min_data(CSVファイル),2)); function csv_get_min_data($path){ $rtn=array(); $csv=fopen($path,'r'); $labels=fgetcsv($csv); $len=count($labels); $row=fgetcsv($csv); for($i=0;$i<$len;$i++){ $rtn[$labels[$i]]=$row[$i]; } while($row=fgetcsv($csv)){ if($rtn[$labels[$i]]>$row[i]){ $rtn[$labels[$i]]=$row[i]; } } return $rtn; } ?> PHPの場合は"00,000"なんてコンマが含まれた 文字列がある場合もちゃんと処理してくれるのでそういうとこで安全 だけど文字コードには注意

hiron0102
質問者

お礼

わぁっ!ありがとうございます! しかしながら・・・PHPはまだ勉強していませんのでさっぱりです(ToT) PHPのこともネットで調べてみたいと思います。

回答No.2

おはようございます。 > ライブラリを使わないなら頑張ってXMLHttpRequestをガリガリ書く ←とくにこれ > 好きな形式でアウトプットする は、どなたか心優しい方がきっと書いてくれるであろうことを期待します <!DOCTYPE html> <body> <script> if(!Array.prototype.map)Array.prototype.map=function(b,e){var c=this.length;if(typeof b!="function")throw new TypeError;for(var d=Array(c),a=0;a<c;a++)a in this&&(d[a]=b.call(e,this[a],a,this));return d}; if(!Array.prototype.reduce)Array.prototype.reduce=function(d){var c=this.length;if(typeof d!="function")throw new TypeError;if(c==0&&arguments.length==1)throw new TypeError;var a=0;if(arguments.length>=2)var b=arguments[1];else{do{if(a in this){b=this[a++];break}if(++a>=c)throw new TypeError;}while(1)}for(;a<c;a++)a in this&&(b=d.call(null,b,this[a],a,this));return b}; var CSV_text = "年,考査,太郎,花子,つとむ\n2009,期末,56,88,95\n2010,中間,97,90,40\n2010,期末,55,49,61\n2011,中間,70,80,63"; var pickup_list = [2,3,4]; var A =  (function (text) {   return text.split (/\r\n|\r|\n/g)         .reduce (          (function (a, b) {           return a.concat ([b.split (/\s*[,\t]\s*/)]);          }), []);  }); var B =  (function (ary) {   return ary.reduce (          function (a, b) {           return b.map (            function (c, i) {             return (isNaN (c))                ? this[i]                : (isNaN (this[i]))                 ? Number (c)                 : Math.min (Number (c), this[i])            }, a);          },          []);  }); var C =  (function (a) {   return this[a];  }); var a = A (CSV_text); var b = B (a); var c = [  pickup_list.map (C, a[0]),  pickup_list.map (C, b) ]; alert(c.join ("\n")); </script>

hiron0102
質問者

お礼

ありがとうございます!! しかし、これだとCSVの中身が変わってしまうとその都度書き換えなければならないですよね…。 CSVが変化しても大丈夫なコードの書き方ってありますか?

  • LOHA
  • ベストアンサー率52% (203/388)
回答No.1

htmlと同一ドメイン上にcsvファイルがあるならJavaScriptだけで可能です。 コードは…面倒なので、ポイントとなる部分だけ書いておきます。 1. Ajaxでファイルを読み込む(jQueryなら$.load。ライブラリを使わないなら頑張ってXMLHttpRequestをガリガリ書く) 2. 結果(文字列)を解析する。(改行でsplit、カンマでsplitすればよいでしょう。文字列はparseIntで数値に変換可能です。) 3. 最小値の計算をする。(まぁこれは問題ないでしょう。) 4. 好きな形式でアウトプットする。(alertで表示 or HTML内に表示 or console.logでコンソールに表示 ...) #ちゃんとしたコードは、どなたか心優しい方がきっと書いてくれるであろうことを期待します。 http://semooh.jp/jquery/ http://webos-goodies.jp/archives/50548720.html

hiron0102
質問者

お礼

ありがとうございます! ガリガリとはいかないまでも、少しずつ本を読みながらやってみたいと思います。

関連するQ&A