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

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

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

5回答

4192閲覧

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

squid_disco

総合スコア14

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/03/02 10:46

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

やりたいこと
言語 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();//

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

ベストアンサー

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

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

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

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

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

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

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

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

投稿2016/03/02 14:09

schi_heil

総合スコア78

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

squid_disco

2016/03/07 11:27

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

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して必要なデータをファイルに出力する。”が新たな発想が生まれました。大変ありがとうございます。皆さまのお力添えで、初心者ですが解決することができました。大変ありがとうございます。

投稿2016/03/07 11:37

squid_disco

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

投稿2016/03/02 11:03

takaki.ishibash

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

squid_disco

2016/03/02 14:20

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

0

惜しい!もう少しです。

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

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

がんばってください。

投稿2016/03/02 10:56

tkanda

総合スコア2425

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

squid_disco

2016/03/02 14:18

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

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 10:56

Alisue

総合スコア103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

squid_disco

2016/03/02 14: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();// //ここまで あと少しで期待する動作ができると思います。ありがとうございます。
Alisue

2016/03/02 17:51 編集

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 ... となり、少し扱いにくいですね。ヒントはここまで。
squid_disco

2016/03/07 11:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問