• ベストアンサー

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

  • CSV検索

    CSV(カンマ区切り)でtest.csvに 1000K,山田太郎,経理課, 1010H,山田花子,秘書課 というファイルがあります。 一番左から社員番号、名前、所属・・・になってます。 検索で、社員番号を入力すると名前が表示されるCGIを探してます。 ちなみに社員番号は数字と英語の組み合わせです。 類似する機能のあるCGIをご存知の方宜しくお願いします。 OR Perlで、ある特定の文字列が含まれている行を返す構文かプログラムを挙げてください。 宜しくお願いします。

    • 締切済み
    • CGI
  • JavaScriptでcgiの戻り値を受け取るには?

    JavaScriptの関数内でcgiを実行(submit)しています。 そのcgiの実行結果(cgiで記述しているexit 0などの0)を受け取る方法を教えてください。 受け取った値によって、alertでメッセージを表示させたいです。 cgiの実行からalertでメッセージを表示させるまでの処理を JavaScriptの1つの関数内で行いたいです。 よろしくお願いいたします。

  • EXCELで進級処理をするには

    昨年の学校全体成績データ(+個人名簿)2004.csv と クラス替え・進級後の個人名簿 2005.csvがあります。 2004.csvを使って昨年の成績を2005.csvのデータに 移動することはできないのでしょうか? 例) 2004.csv 年,組,名前,点数1,点数2 1,1,山田太郎,4,3 1,2,山田花子,3,3 2005.csv 2,1,山田花子 2,2,山田太郎 ↓ 2,1,山田花子,3,3 2,2,山田太郎,4,3

  • cgiでcsvで保存できるアンケートを探しています

    アンケートをHPで行いたいのですが、以下のようなcgiを探していますが見つかりません。おすすめでご存じの方がいましたらご紹介くださいませ。 ・入力データがcsvで保存蓄積される ・集計結果が表示されない ・重複登録ができない(できれば) ・必須項目が指定できる(できれば)

    • 締切済み
    • CGI
  • CSVファイルのダウンロード方法について

    CSVファイルのダウンロード方法についてご教授願います。 (いろんなサイトやFAQをみてきましたが、いまいちわからなかったのでここで質問させていただきます。) 現在、 (1)アンケート項目データ採取.cgi(集計プログラミング込み)…ブラウザ上表示はではcgiにhtmlテンプレートを読み込み ↓ (2)集計.CSVにてデータ集計 ↓ (3)検索.cgiにて(2)集計.CSVのソートや詳細の検索ができる ---------- 他、(4)修正phpがあり、(2)集計.cgiを集計できます。 ---------- (1)、(3)、(4)各ページで<a href="***/***/集計.csv">_CSVダウンロード_</a>なるものをリンク表記したのですが、ダウンロードできません。 どうしたらよいでしょうか?

    • 締切済み
    • CGI
  • サーバにあるdata.txtをブラウザにcsvで表示したい。

    サーバにあるdata.txtをブラウザにcsvで表示したい。 アンケートcgiで、できたdata.txtをブラウザ上(管理画面のようなパスワードがかかった画面)で、csv表示もしくはCSVデータとしてダウンロードするのに、一番簡単な方法はなんでしょうか。 どういうプログラムを組んだらいいのか検討もつかなくて、困っています。

  • cgiのログをcsvとして出力、編集がうまくできません

    フリーのcgiスクリプトを利用して入力したものが表の ような形式で表示できるWEBページを作りました。 データをいくつか入力した後、ログファイルの「<>」を 「,」に置換し、csvファイルとしてエクセルで読み込み、 エクセルでデータを沢山入力してからまた逆に置換し、 cgiのログに戻そうとしたところ、エクセルで開いた 時に文字化けしています。 ログデータそのものは、メモ帳で開くと文字化けしてい ますが、Tera Padで開くとちゃんと見えます。 なんとかしてエクセルでうまく表示させ、編集すること はできないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CSVをエクセルでアップデートしたいのですが

    現在、ホームページに設置したデータベース検索CGIに入れてある会員名簿のcsvファイルがあるんですが、 これがエクセルで 会員番号  氏名   郵便番号   住所             TEL  1   鎌倉太郎 123-0001 東京都中央区架空町2-21-13 03-5123-0125  2   市原三郎 456-0001 東京都中央区架空町1-51-13 03-5123-0125  3   山田洋子 789-0001 東京都中央区架空町3-28-11 03-5123-0125  4   船橋香織 876-0001 東京都中央区架空町4-24-14 03-5123-0125  5   相模大介 321-0001 東京都中央区架空町5-21-10 03-5123-0125  6   川崎花子 888-0001 東京都中央区架空町1-11-11 03-5123-0125 と表示されるようになっているとします。 ここに、更新されたデータだけ抽出された  2   市原三郎 456-0001 東京都新宿区番外町4-55-66 03-5123-0125  4   浜松香織 876-0001 静岡県三島市新天町5-12-10 052-123-0125  6   川崎花子 444-0001 千葉県松戸市某乃町5-21-10 047-523-0125 というcsvファイルが友人からメールで届いたとしたら、このデータを読み込むことや、それに準じるいくつかの簡単な操作だけで、同じ会員番号のデータだけ上書きされるようにする事って出来ないでしょうか? 私はエクセルに関しては殆ど無知で、csvファイルを表として見たり、ソートしたりするためにしか使ったことがない人間なので、もし私が望んでいる事が可能でしたら、メニューバーの「○○」から「×××」という項目に入って…などと、ステップを具体的に教えて頂けるとありがたいのですが…。

  • ピボットテーブル

    エクセルで次のようなデータがあります。 日にち 氏名 時間 1  太郎 18:00 1  花子 19:00 3  太郎 20:00  これを次のようなシートにする方法をお教えください。 日にち 太郎  花子 1   18:00 19:00 2 3   20:00 つまりデータのない日にちも表示したいんです。 ピボットテーブルでは2日が表示されません。 よろしくお願いいたします。

  • javascriptでcsvの1行のカウント方法

    http://blog.sorasol.co.jp/?p=13 ↑こちらのサイトのプログラムで、CSVからテーブルを作る方法を利用しています。 上記サイトの内容ですと、CSVの量が分からない場合に対応できないので、行数を数えて表示をさせたいと思っています。 perlでは、ファイル読み込み時に1行ごとに格納できたと思うのですが、javascriptではそのようなことはできるのでしょうか?調べてみたのですが、同じような記述が見当たらず、他の方法も探してみたのですが(改行の場所でカウント?など)分からなかったので、解説しているサイトなどを教えていただければと思います。 よろしくお願いします

専門家に質問してみよう