- ベストアンサー
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での方法(コード記述)をご教授ください。 よろしくお願いいたします。
- みんなの回答 (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>
その他の回答 (8)
- babu_baboo
- ベストアンサー率51% (268/525)
#2です。 No1の方がおっしゃていたように、「Ajaxでファイルを読み込む」処理が必要です。 ガリガリ誰かが書いてくれると期待しています。
お礼
やはり、専門の方でも少し面倒な作業が必要なんですね(;_;) ちょっと超初心者の私にはハードルが高いみたいです。。。 でも、もう少し頑張ってみます! (他の方の回答も期待しながら…) アドバイスありがとうございました!
- babu_baboo
- ベストアンサー率51% (268/525)
#2です それにデータを追加して試してみましたか?
お礼
はい! 下記の例では答えが変化しないので 【2012,期末,20,10,15】をCSVファイルに追記しましたが答えは変わりませんでした。 しかしながら、コードに追記したら表示されました。 ということは、やはり何かCSVファイルを読み込む記述をしなければなりませんよね。。。
- babu_baboo
- ベストアンサー率51% (268/525)
#2です。 >CSVの中身が変わってしまうとその都度書き換えなければならない どのへんを見てそう思われたのですか?
お礼
var CSV_text = "年,考査,太郎,花子,つとむ\n2009,期末,56,88,95\n2010,中間,97,90,40\n2010,期末,55,49,61\n2011,中間,70,80,63"; です。 ち、違うのですか!??(汗
- babu_baboo
- ベストアンサー率51% (268/525)
#2です CSVが、どのように変化しますか?具体的にお願い致します。最小値の計算はできています。 後は、どれをどう表示するかだけなのですが・・・
お礼
早々のお返事ありがとうございます! CSVは入力フォームによって上書きされていきます。 項目の【年,考査,太郎,花子,つとむ】は変わりません。 その下の行が増えていくだけです。 例えば、【2012,期末,99,88,77】が追加されるといった感じです。
- H240S18B73
- ベストアンサー率65% (190/288)
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; } ?>
お礼
わざわざ訂正ありがとうございます!
- H240S18B73
- ベストアンサー率65% (190/288)
楽なのは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"なんてコンマが含まれた 文字列がある場合もちゃんと処理してくれるのでそういうとこで安全 だけど文字コードには注意
お礼
わぁっ!ありがとうございます! しかしながら・・・PHPはまだ勉強していませんのでさっぱりです(ToT) PHPのこともネットで調べてみたいと思います。
- babu_baboo
- ベストアンサー率51% (268/525)
おはようございます。 > ライブラリを使わないなら頑張って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>
お礼
ありがとうございます!! しかし、これだとCSVの中身が変わってしまうとその都度書き換えなければならないですよね…。 CSVが変化しても大丈夫なコードの書き方ってありますか?
- LOHA
- ベストアンサー率52% (203/388)
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
お礼
ありがとうございます! ガリガリとはいかないまでも、少しずつ本を読みながらやってみたいと思います。
お礼
すごいです!ちゃんと表示されました!! こんな素人にお付き合い下さり、ありがとうございました。 これを機にコードの意味をもっと理解し、がんばって勉強したいと思います(^-^)/