- - PR -
ファイル出力について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-05-30 14:47
お世話になってます。
ファイル出力のプログラムです。 abc.txtの内容・・・a,a,a import java.io.*; public class ExIO1 { public static void main(String[] args) { try { //Fileオブジェクトの生成 File inFile = new File("abc.txt"); //Fileオブジェクトの生成 File outFile = new File("xyz.txt"); //FileReaderクラスのオブジェクトの生成 FileReader in = new FileReader(inFile); //(FileWriterクラスのオブジェクトの生成 FileWriter out = new FileWriter(outFile); int contents; //読み込みデータがなくなるまで読み込み while ((contents = in.read()) != -1) { //(書き込むデータがなくなるまで書き込み out.write(contents); } in.close(); //読み込みストリームを閉じる out.close( ); //書き込みストリームを閉じる } catch(IOException e) { } } } abc.txtの内容をxyz.txtに出力するプログラムです。 このプログラムに、abc.txtのカンマ(,)を、パイプ(|)にしてxyz.txtに出力する処理を追加したい のですが、わかりません。 こんな感じです↓ xyz.txtの内容・・・a|a|a レベルの低い質問かと思いますが、よろしくお願いします。 | ||||
|
投稿日時: 2006-05-30 15:06
読み込みと書き込みのロジックが空っぽですね。
まずは、変換のことは忘れて、変換無しのコピーを作成することに挑戦してはいかがですか。 その後、自分が挑戦してみたロジックをもって、再投稿されることですね。 現状では、代わりにプログラミングしてくれ、といっているのと変わりないかと。 スレ主さんの場合、レベル云々よりも、マナーの方が気になります。 | ||||
|
投稿日時: 2006-05-30 15:17
','を'|'へ置き換えて出力すれば良いだけでは? | ||||
|
投稿日時: 2006-05-30 19:33
変換なしのコピーに関しては、まなさんが提示されたコードで実現できていますよ > Edosson さん
まなさんのコードをそのままコンパイル&実行して確認しました。 (処理効率の問題はありますが、それはここでは言及しません。) 本題ですが、
ここの段階で、読み込んだ一文字が contents 変数に入っています。 現状ではこれを何も加工していないので丸ごとコピーされますが、これに対して「contents が ',' だったら '|' に置き換える」という操作を追加すればよいことはおわかりでしょうか > まなさん おわかりならば、後は 1〜2 行のコードを追加するだけで実現できることもお気付きになるかと存じます。 | ||||
|
投稿日時: 2006-05-30 20:07
ご指摘ありがとうございます。
カンマをパイプにする処理は出来ました。(ファイル名を引数にしました。) 実はこの先、下記のような処理を行います。 abc.txtの内容 ********************************************************* NAME=1000 DATE=20060530 ←ヘッダー(NAME=1000) 0830,,,,,,,,0107,370000,08:30,6 0831,,,,,,,0107,370000,08:31,7 0841,,,,,,,0107,370000,08:41,7 0900,,,,,,,0102,415000,09:00,7 NAME=2000 DATE=20060529 ←ヘッダー(NAME=2000) 0830,,,,,,,0107,580,08:30,4000 NAME=3000 DATE=20060530 ←ヘッダー(NAME=3000) 0830,,,,,,,0107,580,08:30,4000 ********************************************************* xyz.txtに出力したい内容 ********************************************************* 20060530|1000|0830|||||||0107|370000|08:30|6 20060530|1000|0831|||||||0107|370000|08:31|7 20060530|1000|0841|||||||0107|370000|08:41|7 20060530|1000|0900|||||||0102|415000|09:00|7 20060529|2000|0830|||||||0107|580|08:30|4000 20060530|3000|0830|||||||0107|580|08:30|4000 ********************************************************* ●実行したい処理● @カンマをパイプに変換 AヘッダーのNAMEとDATEを、パイプ区切りの行の1つ目、2つ目に持ってくる (1〜4行目はNAME=1000、DATE=20060530、5行目はNAME=2000、DATE=20060529、6行目はNAME=3000、DATE=20060530) Bヘッダーを消す AとBが分かりません。ヒントでよいので分かる方いましたら、よろしくお願いします。 public class Sample{ public static void main(String[] args){ try{ BufferedReader fin = new BufferedReader(new FileReader(args[0])); FileWriter fw = new FileWriter(args[1]); String line; while((line=fin.readLine())!=null){ line=line.replace(',','|'); //NAME(ヘッダー)という文字列を探す while(line.indexOf("NAME") == -1){ } fw.write(line+ "\n"); } fw.close(); }catch(IOException e){ System.out.println(e); } } } | ||||
|
投稿日時: 2006-05-30 21:04
行という単位に依存する処理であれば、
java.io.BufferedReaderという便利なクラスがあり、 ストリームを行単位で文字列で読み込めます。 詳しくはJavadocまたは、ググってみて下さい。サンプルは多いですよ。 文字列化されれば、無視するなり、変換するなり 自由に対処可能かと思います。 ちなみにjava.io.PrintWriterを使うと、簡単に行出力ができます。 | ||||
|
投稿日時: 2006-05-31 09:44
ありがとうございます。
下記のようになりましたが、 Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: のエラーが出ます。 エラーを出ないように、ヘッダーのデータを先頭に追加する方法はあるのでしょうか。 あと、ヘッダーの削除の方法がわかりません。 public class Sample{ public static void main(String[] args){ try{ BufferedReader fin = new BufferedReader(new FileReader(args[0])); FileWriter fw = new FileWriter(args[1]); String line; String header=""; while((line=fin.readLine())!=null){ line=line.replace(',','|'); /*ヘッダーか判断*/ if(line.indexOf("NAME") == 0){ System.out.println(line.length()); header = (line.substring(16,)+"|"+line.substring(5,4))+"|" }else{ fw.write(header + line + "\n"); } } fw.close(); }catch(IOException e){ System.out.println(e); } } } | ||||
|
投稿日時: 2006-05-31 10:05
完成間近ですね。
substringの第二引数を勘違いしているようです。 第一引数も1つずれてるかな? もう一度javadocを参照してみましょう。 それから次の行ですが、 System.out.println(e); 通常はこう書きます。 e.printStackTrace(); 蛇足ですが、私ならjava.util.regexのPatternとMatcherを使用します。 正規表現に対する知識が必要なので、少し難しいかもしれませんね。 下が簡単な使用例です。 String input = "AGE=20 BIRTHDAY=19860531"; Pattern p = Pattern.compile("AGE=([0-9]+) BIRTHDAY=([0-9]+)"); Matcher m = p.matcher(input); if (m.matches()) { System.out.println(m.group(1)); System.out.println(m.group(2)); } [ メッセージ編集済み 編集者: luckseed 編集日時 2006-05-31 10:09 ] |