重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

jqueryについて質問です。とある動的csvファイルからある特定の列を取り出し、grepを使って値のないものを取り除きたいと思っています。しかしunderfindとなってしまいます。どこを修正すればいいのでしょうか?

ちなみにgrepのところを削除すると、「90 247 312 149 360 NaN 110 yMin=90, yMax=360 」という値が返ってきます。
希望は「90 247 312 149 360 110 yMin=90, yMax=360 」という値が返ってきて、最終的には最終行から3つの値、「149 360 110」を取り出したいと考えております。
このcsvファイルは動的で、行数は変化します。

function loadcsv2(url) {
if (window.ActiveXObject) {
var httpObj = new ActiveXObject("Microsoft.XMLHTTP");
if (httpObj) {
httpObj.open("GET","sample2.csv", false);
httpObj.send();
}
} else if (window.XMLHttpRequest) {
httpObj = new XMLHttpRequest();
httpObj.open("GET", "sample2.csv", false);
httpObj.send(null);
}

var rows = httpObj.responseText.split("\r\n");
var dates = new Array();
var items = new Array();
items[0] = new Array();

var result = "";
var n;
for (n = 1; n < rows.length; n++) {
var fields = rows[n].split(",");
if (fields.length < 3) break;//3列目まで
dates[n] = fields[0];
items[0][n] = n==0 ? fields[1] : parseInt(fields[1]);
var datax = items[0][n]
datax = $.grep(datax,function(e){ return e;});
result += datax + "\n" ;
}

}


===【sample.csv】===
day,sizeA,sizeB
11-19,90,254
11-20,247,261
11-21,312,258
11-24,149,250
11-25,360,215
11-26,,450
11-27,110,196

A 回答 (3件)

#1です。



「2行目以降のデータの2列目で有効な数値のうちの最大、最小値と最後の3個のデータを求める」
というものと勝手に解釈しました。
(仮変数がdataxなのに、yMax、yMinとxがyになっているのがよくわからないけれど…)

最終的に文字列が必要なのか個々のデータが必要なのかも不明ですが、とりあえずデータが取れればよいとして、
(全角空白は半角に)

var rows = [
 "day,sizeA,sizeB",
 "11-19,90,254",
 "11-20,247,261",
 "11-21,312,258",
 "11-24,149,250",
 "11-25,360,215",
 "11-26,a,450",
 "11-27,110,196"
];

var result = [];
var n;
var datax;
var yMin, yMax;

for (n = rows.length-1; n > 0; n--) {
 datax = parseInt(rows[n].split(",")[1]);
 if(!isNaN(datax)){
  if(result.length<3) result.unshift(datax);
  yMin = yMin===undefined?datax:Math.min(yMin, datax);
  yMax = yMax===undefined?datax:Math.max(yMax, datax);
 }
}

alert(result.join(" ") + " / yMin=" + yMin + ",yMax=" + yMax);


その他の気になった点は#1に上げたとおりです。
    • good
    • 0
この回答へのお礼

文章の書き方が悪く、すみませんでした。
しかし、まさにやりたいことズバリ理解して頂けて嬉しいかぎりです。
で、早速例にならって実行してみましたが・・・
全く何も表示されず(IE、Firefox)、エラーすらも返されませんでした。
もうお手上げです(T_T)
お助けを・・・

お礼日時:2012/06/07 09:06

#2です。



>全く何も表示されず(IE、Firefox)、エラーすらも返されませんでした。
>もうお手上げです(T_T)
#2の例のままで動作しないということでしょうか?
(その場合は、エラー表示ぐらいは出ると思うのですが…)


それとも、実装したら動かないということでしょうか?
その場合は、#1、#2にも書きましたが、特に怪しそうなのはajaxでのデータの受け取り方あたりかと…
(どのような実装なのかわかりませんので、ヤマカンですが)
    • good
    • 0
この回答へのお礼

失礼致しました。
自分の入力ミスで無事動作いたしました。
あとは自力で実装してみて頑張ってみます。

この度はご面倒をおかけしてすみませんでした。
もっと精進したいと思います。

お礼日時:2012/06/07 20:32

なんかよくわかってませんが…



>最終的には最終行から3つの値、「149 360 110」を取り出したい
その他の必要なこともやっているみたいですが、何をしたいのかよくわからないので、この部分(↑)の処理の一例だけを。
有効な数字を後ろから3つとるということでよいのなら、後ろからテストしていったほうがよさそう。

なお、ご提示にならってparseInt()で数値化していますが、この場合、"119abc"などは数値として評価されます。
 (全角空白は半角に)

var rows = [
 "day,sizeA,sizeB",
 "11-19,90,254",
 "11-20,247,261",
 "11-21,312,258",
 "11-24,149,250",
 "11-25,360,215",
 "11-26,,450",
 "11-27,110,196"
];

var result = [];
var n;
var fields
var datax;


for (n=rows.length-1; n>0; n--) {
 fields = rows[n].split(",");
 datax = parseInt(fields[1]);
 if(!isNaN(datax)) result.unshift(datax);
 if(result.length>2) break;
}

alert(result.join(","));


◇その他
>「90 247 312 149 360 NaN 110 yMin=90, yMax=360 」という値が返ってきます。
同じ処理を通すのなら、後ろの二つはNaNになりませんか?(最後の","はタイポと判断)

for(){ ~~ } の中で n==0 を判断しているけれど、初期値がn=1なので常にfalseになるのでは?

jQueryのgrep()は知りませんけれど、第一引数は配列なのでは?
しかも function(e){ return e; } だと、多分0も除外だけれど意図通りなのだろうか?
http://api.jquery.com/jQuery.grep/

ajaxでコールバックを用いていないようですが、タイミングが合わないのでは?
また、どうせjQueryを使うのならこの部分でも利用した方が簡略化できそう・・・
    • good
    • 0
この回答へのお礼

すいません、自分の質問の文章やらコードがめちゃくちゃですね。
コードは途中の
var yMin = items[0][1];
for (var j = 1; j < n; j++) {
if (items[0][j] < yMin) yMin = items[0][j];
if (items[0][j] > yMax) yMax = items[0][j];
}

result += "yMin=" + yMin + ", yMax=" + yMax + "\n";
return result;
が抜けていました。
2行目の最大値と最小値を求めています。
教えていただいたコードも考慮しながら、ちょっともう少し考えてみます。

お礼日時:2012/06/06 08:44

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