- ベストアンサー
配列ごとのプログラム開発(JAVA)
- 配列(セル)ごとのプログラム開発(JAVA)についてのご質問です。
- 13フィールド(セル)あるテキストを読み込み、特定のセルのデータを抽出するプログラムの組み立て方についてお教えください。
- String型の配列を使用して個別にデータを抽出する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
郵便番号と住所カナの出力が2行に分かれてしまうのが嫌なら、そこで改行しなければいいのです。println()を使うと改行されることは理解していますね? ・郵便番号()と住所カナ()メソッドの中でout.println()しているところを全てout.print()に変える ・(8)のループの中にカンマと改行の出力を追加する (※の行) 郵便番号(arrayline[5], out); out.print(","); // ※ 住所カナ(arrayline[6], out); out.println(); // ※ でなければ、ANo.2に書いたように出力を(8)のループの中だけで行うようにします。当然郵便番号()・住所カナ()メソッドの仕様も合わせて変える必要があります。 String output1=郵便番号(arrayline[5]); String output2=住所カナ(arrayline[6]); out.println(output1+","+output2);
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
> arrayline[5]とarrayline[6]のデータそれぞれの処理を独立した > プログラムの単位(クラスやメソッド)にしたい ごく単純にやるなら、(8)のループを以下のように書き換えて、 while((line = in.readLine()) != null) { arrayline = line.split(","); yuubinBangoSyori(arrayline[5], out); zyuushoKanaSyori(arrayline[6], out); out.flush(); } yuubinBangoSyori(String yuubinBango, PrintWriter out)やzyuushoKanaSyori(String zyuushoKana, PrintWriter out)というメソッドを作ってそこに必要な処理を書いてください。 出力処理までをyuubinBangoSyori()やzyuushoKanaSyori()の中でやるなら上述のようにPrintWriterを引数として渡すのがいいでしょうが、yuubinBangoSyori()やzyuushoKanaSyori()は出力すべき内容をStringとして返すだけにして、PrintWriterでの出力は上記のループの中で行うようにする(当然、yuubinBangoSyori()やzyuushoKanaSyori()にはPrintWriterの引数は不要になる)手もあります。 もっとも、「Aセルに表示」「Bセル表示」という部分が意味不明なので、上記のような構成で上手くいくのかどうか怪しいですがね。 出力したテキストファイルを後で表計算ソフトウェアに読み込ませたときにA列やB列に現れるようにせよ、という話なのかなと想像しますが、PrintWriterでテキストファイルに出力している時点ではセルなんていう概念は存在しないので。
補足
>もっとも、「Aセルに表示」「Bセル表示」という部分が意味不明なので、上記のような構成で上手くいくのかどうか怪しいですがね。 アドバイスどうもありがとうございます。 確かに分かりやすくしたつもりが意味不明で説明不足でした。 配列を確認する際、カンマ区切りで配列が区切られているイメージを Aセル、Bセルと表現してました。 アドバイスいただいた通り下記のようなメソッドを作ってそこに必要な処理書いてみました。 現在は下記のソースですと 郵便番号と住所のデータが同じ配列で交互に出力されている状態です。 現状アウトテキストイメージ 0102000088 ホッカイドウサッポロシ 0102000088 トウキョウトイケブクロ 0102000088 オキナワケンナハシ 希望アウトテキストイメージ 0102000088,ホッカイドウサッポロシ 0102000088,トウキョウトイケブクロ 0102000088,オキナワケンナハシ //(8)読み込みソースがなくなるまで読み込み、 // 読み込みデータをprintlnメソッドで書き込み while((line = in.readLine()) != null) { arrayline = line.split(","); 郵便番号(arrayline[5], out); 住所カナ(arrayline[6], out); out.flush(); } in.close(); //(9)読み込みストリームのクローズ out.close(); //(10)書き込みストリームのクローズ return pipeIn; //(11)pipeInオブジェクトのリターン } private void 郵便番号(String 郵便番号, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ String score = 郵便番号; if (score.substring(3,5).compareTo ("00") == 0 && score.substring(5,7).compareTo (" ") == 0) { out.println(score.substring(0,3) + "-"); //4桁目5桁目00の場合なおかつ6桁目7桁目が" "の時左から1.2.3桁抽出+ハイフン } else if (score.substring(7,9).compareTo (" ") == 0) { out.println(score.substring(0,3) + "-" + (score.substring(3,5))); //6桁目7桁目" "の場合左から1.2.3桁抽出+ハイフン+4.5桁目抽出 } else { out.println(score.substring(0,3) + "-" + (score.substring(3,7)));} //それ以外左から3桁抽出+ハイフン+4.5.6.7桁目抽出 } private void 住所カナ(String 住所カナ, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ out.println(住所カナ); }
- salsberry
- ベストアンサー率69% (495/711)
前の質問(QNo.7460130)もそうなんですが、「arrayline[0]からarrayline[12]の配列を個別にプログラム開発」という部分が一般的な表現ではないので質問の意図が分からないのですよね。 かなり推測を交えますが、やりたいのはこういうことですか? (1) CSVファイルから1行読み込む。読み込めるデータがなくなったら終了。 (2) 読み込んだ1行のデータを13要素のStringの配列に変換してarrayline[]に代入する。 (3) 次の★の作業を、arrayline[]の各要素(n=0~12)に対して順に適用する。 ★arrayline[n]のデータに対して何か処理を行い、その結果をout.println()で書き出す。 [前提] ・ある行の処理を行う際にそれ以前の行の内容を参照する必要はない。 ・x≠yとして、arrayline[x]の処理をする際にarrayline[y]を参照する必要はない。 (4) (1)へ戻る。 ここで、★で行う処理はnの値によって異なり、n=0~12のそれぞれの処理を独立したプログラムの単位(クラスやメソッド)にしたい(これが「個別に開発」の意味)のだが、プログラムをどういう構成にしたらいいか?というのが質問内容でしょうか? やりたいことと質問内容、それぞれ、全然違うと思ったらどこがどう違うのか補足してください。 もし上記の推測が全て合っていた場合、質問の書き方があまり上手くないと思います。 ・「配列をプログラム開発」とか前の質問の「Editごとにプログラム開発」とかの表現は一般的ではないので、何をしたいのかが伝わってこない。 ・配列内容に含まれなさそうな「売上」に関係したコメントがコード中に唐突に出てくるので話の焦点がぼやける。 ・「arrayline[6]+","+arrayline[7]+","+arrayline[1]」のように、arrayline[]の複数の要素を一度に参照するような例が出てくるので、★の前提(arrayline[]の各要素を1つずつ独立に処理する)と合っていない。このため「個別に開発」の意味が分かりづらい。 推測が外れていた場合は、回答者が推測をしなくていいような書き方をしてください。 test_in.txtにどんなデータが入っていたときにtest_out.txtにどんな結果が出力されてgetValue()は何を返すのか、入力データの例と期待している結果を書けば多少分かりやすくなるかもしれません(13要素全部書くと長くなるので、3要素ぐらいに簡略化してもいい)。
補足
アドバイスどうもありがとうございます。 >もし上記の推測が全て合っていた場合、質問の書き方があまり上手くないと思います。 ・「配列をプログラム開発」とか前の質問の「Editごとにプログラム開発」とかの表現は一般的ではないので、何をしたいのかが伝わってこない。 一般的な用語で分かりにくかった質問に対して大変失礼いたしました。 それと売上コメント等別で検証していたコメントを消し忘れていたため 分かりにくくさせていたのだと思います。 salsberryさんの推測した通りで、n=0~12のそれぞれの処理を独立した プログラムの単位(クラスやメソッド)にしたいとういうの質問内容になります。 クラスやメソッドについても色々と勉強しているのですがなかなか理解できなくで ご投稿させていただきました。 初心者の為、一般的なJAVA言語で説明できなかったため 直観的なイメージで質問してしまっていることを ご了承ください。 質問のソース通りで 例えばarrayline[0]-arrayline[12]の配列の中で 2つの配列のみ arrayline[5]とarrayline[6]のデータそれぞれの処理を独立した プログラムの単位(クラスやメソッド)にしたい というご質問にさせていただきます。 ここからまた、ご回答様に伝わるかどうか難しいのですが・・・ プログラム開発例 指示1 *10桁の郵便番号データに対して 4桁目5桁目00の場合なおかつ6桁目7桁目が" "の時左から1.2.3桁抽出+ハイフンを抽出 6桁目7桁目" "の場合左から1.2.3桁抽出+ハイフン+4.5桁目抽出 それ以外左から3桁抽出+ハイフン+4.5.6.7桁目抽出して Aセルに表示してください。 指示2 inData[6] = "住所カナ";を何も手を加えず Bセル表示してしてください。 結果 void test0() { //(function_5)郵便番号if判定 String score = inData[5]; if (score.substring(3,5).compareTo ("00") == 0 && score.substring(5,7).compareTo (" ") == 0) { out.println(score.substring(0,3) + "-"); //4桁目5桁目00の場合なおかつ6桁目7桁目が" "の時左から1.2.3桁抽出+ハイフン } else if (score.substring(7,9).compareTo (" ") == 0) { out.println(score.substring(0,3) + "-" + (score.substring(3,5))); //6桁目7桁目" "の場合左から1.2.3桁抽出+ハイフン+4.5桁目抽出 } else { out.println(score.substring(0,3) + "-" + (score.substring(3,7)));} //それ以外左から3桁抽出+ハイフン+4.5.6.7桁目抽出 } void test1() { //住所カナ抽出 String 住所カナ = inData[5]; out.println(カナ); } 結果 arrayline[0]-arrayline[12」の中から Aセル(Aフィールド)arrayline[5]の郵便番号データと Bセル(Bフィールド)arrayline[6]の住所カナデータを それぞれの処理を独立した プログラムの単位(クラスやメソッド)にして開発し arrayline[5]とarrayline[6]の2種類のデータのみ抽出したい といったご質問内容に代えさせていただきます。 質問がわかりにくい場合、もしくは質問内容が伝わらない 足らない場合は訂正いたしますので どうぞよろしくお願いいたします。 念のためご報告させていただきますが クラスやメソッドを勉強して 現時点で、うまくいかないので ご質問させていただいています。
お礼
各メソッドごとのプログラムは少し変更しておりますが 解決したことをご報告いたします。 println()を使うと改行されることは理解しておりますが 構文にすると出来ない部分ではありました。 今回のご質問をする前も 各メソッドを作成して、カンマで区切るところもイメージしながら 検証はしていたのですが やはり構文の書き方がうまくいかずにいました。 過去のクラスの継承の質問からお手数をおかけしました。 今後は各メソッドのプログラム開発のため 勉強していこうと思っております。 どうもありがとうございました。 //(8)読み込みソースがなくなるまでBufferedReaderで1行ずつ読み込み、 // 読み込みデータをprintlnメソッドで書き込み while((line = in.readLine()) != null) { arrayline = line.split(","); //(9)出力テキストデータ //1field 郵便番号(arrayline[5], out); out.print(","); // ※ //2field 基礎年金番号(arrayline[0],arrayline[1], out); out.print(","); // ※ //3field 住所漢字(arrayline[7], out); out.println(); // ※ out.flush(); } in.close(); //(10)読み込みストリームのクローズ out.close(); //(11)書き込みストリームのクローズ return pipeIn; //(12)pipeInオブジェクトのリターン } //(************************************************************************************************ //(13)フィールドごとのプログラム //(************************************************************************************************ //function1 郵便番号編集 private void 郵便番号(String 郵便番号, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ String score = 郵便番号; if (score.substring(3,5).compareTo ("00") == 0 && score.substring(5,7).compareTo (" ") == 0) { out.print (score.substring(0,3)); //4桁目5桁目00の場合なおかつ6桁目7桁目が" "の時左から1.2.3桁抽出+ハイフン } else if (score.substring(5,7).compareTo (" ") == 0 && score.substring(3,5).compareTo ("00") != 0) { out.print (score.substring(0,3) + "-" + (score.substring(3,5))); //6桁目7桁目" "の場合左から1.2.3桁抽出+ハイフン+4.5桁目抽出 } else { out.print(score.substring(0,3) + "-" + (score.substring(3,7)));} //それ以外左から3桁抽出+ハイフン+4.5.6.7桁目抽出 } //function2 基礎年金番号編集 private void 基礎年金番号(String 基礎年金番号, String 年金番号, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ String 基礎年金コード = 基礎年金番号; String 年金コード = 年金番号; String 算出コード = 基礎年金コード + 年金コード; String 管理コード= "5678"; out.print(Long.parseLong(算出コード) - Long.parseLong(管理コード)); } // function3 住所漢字編集 private void 住所漢字(String 住所漢字, PrintWriter out) { // TODO 自動生成されたメソッド・スタブ out.print(住所漢字); }