アプリ版:「スタンプのみでお礼する」機能のリリースについて

こんにちは。超初心者です。
サーバー上にある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での方法(コード記述)をご教授ください。
よろしくお願いいたします。

A 回答 (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>
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/05/19 15:34

#2です。



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

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

アドバイスありがとうございました!

お礼日時:2012/05/15 00:21

#2です



それにデータを追加して試してみましたか?
    • good
    • 0
この回答へのお礼

はい!
下記の例では答えが変化しないので
【2012,期末,20,10,15】をCSVファイルに追記しましたが答えは変わりませんでした。

しかしながら、コードに追記したら表示されました。

ということは、やはり何かCSVファイルを読み込む記述をしなければなりませんよね。。。

お礼日時:2012/05/14 20:39

#2です。



>CSVの中身が変わってしまうとその都度書き換えなければならない

どのへんを見てそう思われたのですか?
    • good
    • 0
この回答へのお礼

var CSV_text = "年,考査,太郎,花子,つとむ\n2009,期末,56,88,95\n2010,中間,97,90,40\n2010,期末,55,49,61\n2011,中間,70,80,63";

です。
ち、違うのですか!??(汗

お礼日時:2012/05/14 20:12

#2です



CSVが、どのように変化しますか?具体的にお願い致します。最小値の計算はできています。

後は、どれをどう表示するかだけなのですが・・・
    • good
    • 0
この回答へのお礼

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

例えば、【2012,期末,99,88,77】が追加されるといった感じです。

お礼日時:2012/05/14 18:17

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;
}

?>
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/05/14 18:12

楽なのは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"なんてコンマが含まれた
文字列がある場合もちゃんと処理してくれるのでそういうとこで安全
だけど文字コードには注意
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/05/14 18:11

おはようございます。



> ライブラリを使わないなら頑張って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>
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/05/14 11:52

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/05/14 11:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!