重要なお知らせ

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

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

読み込んだテキストファイルの数字を使って計算するにはどうしたらいいのでしょうか?


以下のコードを使って、サーバーにあるテキストファイルを読み込み、新しく作成した2つの配列に格納しました。ただ最後の「格納データの表示」ではこの作成した配列要素が表示できません。「データを配列に格納」のファンクション内では、配列作成時にvarを使わずスコープをglobalにしたつもりです。

目的としては、このテキストファイルにある数字を使っていろいろと計算できればと考えてます。

助言などよろしくお願い致します。

    
// データのロード
    function loadDataFile()
{
httpObj = createXMLHttpRequest(storeData);
if (httpObj)
{
var fname = "upload/cluster.txt";
httpObj.open("GET", fname, true);
httpObj.send(null);
}
}

    
    // データを配列に格納
function storeData()
{
if ((httpObj.readyState == 4) && (httpObj.status == 200))
{
document.getElementById("resultData").innerText = httpObj.responseText;

// 改行
var LF = String.fromCharCode(10);
// タブ区切り
var TAB = String.fromCharCode(9);

// テキストを改行区分
var lines = httpObj.responseText.split(LF);

// データ格納配列を準備(global scope)
oArray = new Array(lines.length-1); // Origin
dArray = new Array(lines.length-1); // Destination

for (var iCnt = 0; iCnt < lines.length-1; iCnt++)
{
oArray[iCnt] = lines[iCnt].split("\t")[0];
dArray[iCnt] = lines[iCnt].split("\t")[1];
}
}else{
document.getElementById("resultData").innerText = "Loading...";
}
}


    // 格納データを表示
function showData()
{
for(var j = 0; j < oArray.length; j++)
{
alert(oArray[j]);
}
}

A 回答 (3件)

全体の流れがわかりませんが…



>「格納データの表示」ではこの作成した配列要素が表示できません
ajaxでテキストを取得してから、表示させてますか?
非同期通信になっているようなので、showDataを値の取得前に実行すれば表示されないはず。


配列定義でlines.length-1にしているのは、データの最後に必ず改行が入っていることになっているから?
いらぬお世話ですが、var TABを定義しているけれど使っていない?


テキストを数字にするには+、-の符号をつけても良いけれど、
数値の判断
 http://www.ajaxtower.jp/js/global_function/index …
数値化
 http://www.sasaraan.net/program/js/jsnumber.html
とかでしょうか…
    • good
    • 0
この回答へのお礼

ありがとうございます。


>ajaxでテキストを取得してから、表示させてますか?
>非同期通信になっているようなので、showDataを値の取得前に実行すれば表示されないはず。

つまり再度 createXMLHttpRequest を使用してデータを取得するということでしょうか?
それともevalやexecScriptを使用するということでしょうか?
初心者の質問で恐縮です。

>配列定義でlines.length-1にしているのは、データの最後に必ず改行が入っていることになっているから?

あいにくそうなんです。

>いらぬお世話ですが、var TABを定義しているけれど使っていない?

すいません。"\t"から変更すべきでした。

お礼日時:2010/11/05 16:22

No1です。



ajaxで通信する場合、通信に多少なりとも時間がかかります。
それなのですぐに表示しようとしても、まだテキストを受け取っていないということがあり得ます。
例えば、
 ・ ・ ・
 loadDataFile();
 showData();
 ・ ・ ・
みたいなコードになっていると、値を配列に格納する前に表示処理を行うことになってしまいます。

どういう手順で(タイミングで)showData()を実行するおつもりなのかわかりませんが、とりあえず「取得できたら表示」でよいのであれば、No2様がおっしゃているようにcallback関数内(=storeData()内)で配列に格納後に実行する(=function callする)ようにすればよろしいかと思います。


実際に、どのようなタイミングにしたいのかがわかりませんが、取得前か後かを判別できるようにしておいたほうが宜しいかも。
例えば、ajax処理を1回しか行わないことがわかっているのならば、変数oArrayが定義されていれば取得済と判別できますし、何度も行う場合は処理のフラグでも設けておいてそれで判定するとかの方法もあるかも。
    • good
    • 0
この回答へのお礼

ありがとうございます。

一度作成したarrayは通常の変数のようにすぐアクセスできるものだと思ってました。
非同期処理をもっと勉強しなくてはとつくづく感じました。

ということは、計算もCallback関数内で行う必要があるということですね。
oArrayやdArrayが作成されるのは一回だけです。

お礼日時:2010/11/05 18:29

showData() を呼び出している部分はどこにあるのでしょうか?


showData() は storeData() 内で呼び出す必要があります。

数値計算する場合は、データ型をNumber型に変換するのも忘れずに。

var number = '-10.5';
alert(typeof number); // string
number = Number(number);
alert(typeof number); // number
    • good
    • 0

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