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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3801閲覧

データの抽出方法を教えてください。

lena

総合スコア31

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/03/02 03:43

JAVA初心者です。
下記のような月額購入表を作成したいのですが、出力時に商品名の値と単価の値が全て同じと
なってしまう原因はなぜでしょうか?
商品コードの比較はできているようなんですが、想定する出力内容になりません。
ご回答よろしくお願いします。

【完成例】
購入日,商品名,数量,単価,合計
20160101,チョコレート,3,100,300
20160102,アメ,10,10,100
201601月合計,,,,400
20160210,ガム,5,100,500
201602月合計,,,,500

【現時点】
購入日,商品名,数量,単価,合計
20160101,ガム,5,100
20160102,ガム,5,10
20160210,ガム,5,100

package sample; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.HashMap; public class PuchaceRecord { public static void main(String[] args) { BufferedReader brInputFileA= null ; //商品マスタ用入力ファイル BufferedReader brInputFileM= null ; //購入明細用入力ファイル BufferedWriter bwOutputFileA = null ; //月額購入表出力ファイル String stBufferM = ""; String stBufferA = ""; HashMap<String,HashMap<String,Object>> stDataM = new HashMap<String,HashMap<String,Object>>() ; //商品マスタの入力データを格納 HashMap<String, Object> mpDataM = null; Object date = ""; //購入明細ファイルの購入月をセット boolean isFirst = true; //0番目の購入日をセットする為の変数 try{ brInputFileA = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inA.csv"),"JISAutoDetect")); brInputFileM = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inM.csv"),"JISAutoDetect")); //inMファイルデータを読み込み while((stBufferM = brInputFileM.readLine()) != null){ String[] item = stBufferM.split(","); mpDataM = new HashMap<String,Object>(); mpDataM.put("code",item[0]); mpDataM.put("name",item[1]); mpDataM.put("price",item[2]); mpDataM.put("bigin",item[3]); mpDataM.put("end",item[4]); stDataM.put(item[0],mpDataM); }//while bwOutputFileA = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Users/temp/Desktop/outA.csv"),"SJIS")); while((stBufferA = brInputFileA.readLine()) != null){ String[] item2 = stBufferA.split(","); if(isFirst){ date = item2[0].substring(0, 6); isFirst = false; } if(stDataM.containsKey(item2[1])){ String a = item2[0]; Object b = mpDataM.get("name"); String c = item2[2]; Object d = mpDataM.get("price"); bwOutputFileA.write(a + ","); bwOutputFileA.write(b + ","); bwOutputFileA.write(c + ","); bwOutputFileA.write(d + ","); bwOutputFileA.newLine(); } }//while brInputFileA.close(); bwOutputFileA.close(); }catch(FileNotFoundException e){ System.err.println("ファイルが見つかりません。"); }catch(IOException e){ System.err.println("何らかのエラーが発生しました。"); } } } }

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

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

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

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

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

guest

回答1

0

ベストアンサー

2つ目ののループの中で「mpDataM = stDataM.get(item[1])」が抜けてるのでゎ?

投稿2016/03/02 04:13

tkturbo

総合スコア5572

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

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

lena

2016/03/02 04:33

ご回答ありがとうございます。 無事解決できました。 mpDataM = stDataM.get(item[1])の内容は何をしているのか理解できませんので よろしければ教えていただけないでしょうか?
tkturbo

2016/03/02 04:43

同じ商品名のデータをstDataMから取得しています。
tkturbo

2016/03/02 04:44

詳しくはこの辺→https://docs.oracle.com/javase/jp/8/docs/api/java/util/HashMap.html
lena

2016/03/02 06:25

tkturboさん、教えていただきありがとうございました。 もう一つだけご質問があります。 HashMapに格納されている数字(文字列)を大小比較する時に、数字に変換して算術演算子で比較したりcompareToを使用しても上手くいかないんです。 何か良い方法をご存じでしたら教えていただけないでしょうか?
tkturbo

2016/03/02 07:33

数字に変換して比較ってのはどんなコード書いてます?
lena

2016/03/02 08:58

if(isFirst){ date = item2[0].substring(0, 6); isFirst = false; } //初期設定 String boughtDay = (item2[0].substring(0, 6)); if(date.compareTo(boughtDay)){ bwOutputFileA.write("*"); bwOutputFileA.newLine(); //合計金額 String a = " "; bwOutputFileA.write(a ); date = item2[0]; ----------------------------------------------------------- dateよりもboughtDayの方が大きければ合計を出すようにしたいのですが、 解決出来ますでしょうか?
tkturbo

2016/03/02 09:48 編集

まず、compareToの使い方がおかしい。「a.compareTo(b)」としたらa>bの時の結果は正の整数、a<bの時の結果は負の整数になる。数値に変換、というのならこの辺を読んで勉強するよろし→https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Integer.html#parseInt-java.lang.String-
lena

2016/03/02 10:40

ご質問にお応えいただきありがとうございました。 compareToの使い方や数値に変換のところをもっと勉強します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問