質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.91%

初心者です。レベルが低く申し訳ありません。カンマ区切りのファイルをsplitで出力を試みています。

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 3,184

score 14

初心者です。レベルが低く申し訳ありません。

やりたいこと
言語 javascript

カンマ区切りのファイルを読み出し、splitで配列処理を行い、
新規ファイルを作成して書き込みを試みています。

現在の結果
書き込みに最後の一行しか出力されません。
”dog”のみ出力

期待値
すべて書き込みを行い、配列[1]の国名をすべて書き込みたい。(cat,pig,dag,dog)

・カンマ区切りのファイルを以下に書きます。

ファイル名:capitals.txt
1,cat,neko
2,pig,buta
3,dag,ahiru
4,dog,inu

・作成中のプログラム

var f, s, ForReading;

ForReading = 1, s = "";

var fso = new ActiveXObject("Scripting.FileSystemObject");

var f = fso.OpenTextFile("animal.txt",1,false);//ファイル読み込み

while (!f.AtEndOfStream) {
s = f.ReadLine( );//sに一行づつ読み込み

WScript.Echo(s);//1から4まで表示する。期待どおりです。

}

WScript.Echo(s);//4までしか表示しない。ここの動作がわかりません。

var out = s.split(/,/);//splitでカンマを処理

f.Close( );

var file =  fso.OpenTextFile("hogehoge.txt", 2, true);//hogehoge新規作成

file.Writeline(out[1]);//カンマ区切りのファイルを書き出し。dogしか出力しません。

file.Close();//

動物名すべてを出力、表示させるにはどのように処理すればよろしいでしょうか。
よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

checkベストアンサー

+1

s = f.ReadLine( );//sに一行づつ読み込み

sは1行分の領域でしかありませんので、次の読み込みで、前の読み込みデータが消えます。

WScript.Echo(s);//4までしか表示しない。ここの動作がわかりません。

最後に読み込んだデータをもう一度表示しているだけです。

file.Writeline(out[1]);//カンマ区切りのファイルを書き出し。dogしか出力しません。 

splitで対象としたデータは、最後に読み込んだデータです。
なので、最後のdogのみが出力されているわけです。

えぇとヒントで良いのでしょうか。
・読み込んだデータは、var s;ではなく、var s = [];と配列にして格納する。
・その配列を繰り返しによりファイルに出力する。
または、
・読み込んですぐにsplitして必要なデータをファイルに出力する。

では、いかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/07 20:27

    返信が遅くなり、申し訳ございません。
    処理につきまして、処理を詳細にご解説いただきありがとうございます。
    読み直してすぐsplit処理をすることで解決いたしました。
    感謝いたします。


    キャンセル

0

var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = fso.OpenTextFile("animal.txt", 1, false);
var s = '';

// while (<A>) { <B> } := <A> という条件の間 <B> を繰り返す
// 今回は <a> が !f.AtEndOfStream なので「ファイルの最後にたどり着いていない場合」です
while (!f.AtEndOfStream) {
  s = f.ReadLine( ); // 「現在の」行を読み込んで「s に上書きする」
                     // その後「次の行」に進む(これによりループで次々と行が読める)
  WScript.Echo(s);   // 上記で読み込んだ行を表示
}
WScript.Echo(s);     // s はことごとく「上書き」されてきたから最後の値しか表示されない

これでどうでしょうか?直接的な回答ではないですが、理解できればおそらくご自身でたどり着けるかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/02 23:15

    ありがとうございます!while文の処理による、WScript.Echoの処理の仕組みを理解しました。

    ただ、処理後の動物別の書き出しがうまくいってません。

    プログラム修正
    var f, s, ForReading;

    ForReading = 1, s = "";

    var fso = new ActiveXObject("Scripting.FileSystemObject");

    var f = fso.OpenTextFile("animal.txt",1,false);//ファイル読み込み

    while (!f.AtEndOfStream) {
    s += f.ReadLine()+"\n";//sに一行づつ読み込み

    }

    WScript.Echo(s);//すべての行を処理していることを確認しました!

    var out = s.split(/,/);//splitでカンマを処理

    f.Close( );

    var file = fso.OpenTextFile("out.txt", 2, true);//hogehoge新規作成

    //ここから期待している動きができていません。
    file.Writeline(out[1]);//catのみ出力。動物列を取得する方法があるはず
    file.Close();//
    //ここまで

    あと少しで期待する動作ができると思います。ありがとうございます。

    キャンセル

  • 2016/03/03 02:45 編集

    out とは何か?を考えてみてください。
    out には文章を , で分離した「配列」が入っているはずです。
    out[1] というのは「outという配列の 1 番めの要素」という意味ですよね?(プログラムの場合大抵は 0 番目から始まることに注意)たくさんの要素の中の 1 番目だけを書き込んでいるので cat だけになります。
    上記を考慮するとすべての動物を出力するためには「0番目から最後まで出力」を行えばいいはずです。現在持っている知識だけでもなんとかなりますが、難しい場合は「for 文」などで調べてみてください。


    ちなみに本当はもう少し良いやり方がありますが、今の段階では良い悪いは無視して、なるべく自分で考えるほうがよいと思います ;-)

    --- 追記 ---

    すみません、状況を少し勘違いしていたようです。
    「上記を考慮するとすべての動物を出力するためには「0番目から最後まで出力」を行えばいいはずです。」と言いましたが、このままではダメですね。何番目に「動物」が入っているのかを考えれば良いと思います。


    ヒント: 改行(\n)でつないできたので s には

    1,cat,neko\n2,pig,buta\n3,dag,ahiru\n4,dog,inu

    という文字列が入っていますね。これを , で区切ると

    out[0] = 1
    out[1] = cat
    out[2] = neko\n2
    ...

    となり、少し扱いにくいですね。ヒントはここまで。

    キャンセル

  • 2016/03/07 20:22

    ありがとうございます。
    返信が遅くなり、申し訳ございません。
    配列についてカンマで区切っているため、扱いずらく複雑になってしまいました。
    詳細にご説明いただき、ありがとうございます。
    解決への大きな手掛かりとなりました。感謝いたします。

    キャンセル

0

惜しい!もう少しです。

以下のように処理を並べ替えるとうまく行きます。

  1. fsoインスタンス作成
  2. 入力ファイルを開く
  3. 出力ファイルを開く
  4. 入力ファイルの末尾に達するまで以下(5~8)を繰り返し
  5. 入力ファイルから一行読み取り
  6. 読取ったテキストを画面に表示
  7. 読取った一行分のテキストから必要な部分を抽出
  8. 出力ファイルに一行書き出し
  9. 入力ファイルを閉じる
  10. 出力ファイルを閉じる

がんばってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/02 23:18

    ありがとうございます。とても参考になります。確認に時間が掛かって申し訳ありません。

    キャンセル

0

s.split(",");
じゃないでしょうか?

split内の/,/はRegExpオブジェクトを生成するときの書き方なので、目的とは別物に見えます笑
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/02 20:09

    いえ、上記でも問題ないはずです。

    separator
    任意。文字列を区切ることに使用するための文字を指定します。separator は文字列、もしくは、正規表現 として扱われます。

    https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split

    キャンセル

  • 2016/03/02 23:20

    ありがとうございます!リンク先のページ、参考になりました。
    Alisue さん ありがとうございます。上記でも問題ないことを確認いたしました。

    キャンセル

  • 2016/03/03 09:17

    >Alisue
    なるほど

    キャンセル

0

//以下にて解決
var fso = new ActiveXObject("Scripting.FileSystemObject"); //オブジェクト生成
var f = fso.OpenTextFile("animal.txt",1,false);//ファイル読み込み 
var file = fso.OpenTextFile("out.txt", 2, true);//out.txt新規作成 

while (!f.AtEndOfStream) {  //EOFになるまで読み込み。(EOFでない場合、読み込みを行う。)
s = f.ReadLine(); //animal.textを一行ずつ読み込む                            
var out = s.split(/,/);//splitでカンマを処理
for(var i = 0;i <= 0;i++){//カンマ区切りのファイル出力を実施。
file.Writeline(out[i,1]);//動物名を出力

WScript.Echo(s);//処理確認

}
}

WScript.Echo(s);//処理確認

f.Close( ); //ファイルを閉じる。
file.Close( ); //ファイルを閉じる

//回答いただきました内容はすべて大変参考になりました。ベストアンサーはご回答いただいたすべての方へお送りしたいのですが、”・読み込んですぐにsplitして必要なデータをファイルに出力する。”が新たな発想が生まれました。大変ありがとうございます。皆さまのお力添えで、初心者ですが解決することができました。大変ありがとうございます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る