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

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

ただいまの
回答率

87.49%

【Java】Hashmapを使って2つのCSVファイルを一つに纏めて出力したい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,412

score 16

支店一覧ファイルと売上報告ファイル(支店ごと複数個)の
2種類のデータファイルが同じフォルダ内にまとまっており、
その2データファイル内に記載の支店コードをキーとして
"uriage"という一つのCSVファイルに纏めて出力したいのですが、
売上の出力結果が下記に添付している通り”0”になってしまいます。

抽出したCSV

キーの指定間違いかと思いましたが違わなそうなのでどこが原因なのか、
ご教示いただけると助かります。
(拙いコードだとは思いますが、まずは自分の力でとりあえずでも動くものを作りたいので
あくまでもアドバイス程度で大きく変更はしないでいただけると助かります。。。)

****売上報告フォルダ****
【支店一覧ファイル】
<shiten>
001,大阪
002,山口
003,福岡
004,東京
005,静岡

【売上報告ファイル】
<000001.rcd>
001
43000000

<000002.rcd>
002
65400000

<000003.rcd>
003
120000

<000004.rcd>
004
5789000
****************

public class Sales {
    public static void main(String args[]) {

        HashMap<String, String> branchName = new HashMap<String, String>(); 
        HashMap<String,Long> branchEarnings = new HashMap<String, Long>(); 
        BufferedReader br = null;

      //1,支店定義ファイルの読み込み
        try {
            File file = new File(args[0], "shiten");
            FileReader filereader = new FileReader(file);
            br = new BufferedReader(filereader);

            String line;
            while((line = br.readLine()) != null) {
                for(int i = 0; i < 2; i++) {
                    String[] box = line.split(",");
                    branchName.put(box[0], box[1]);
                    branchEarnings.put(box[0], (long)0);
                    }
                System.out.println(line);
            }
        } catch(IOException e) {
            System.out.println("予期せぬエラーが発生しました");
        } finally {
            if(br != null) {
                try {
                    br.close();
                } catch(IOException e) {
                    System.out.println("予期せぬエラーが発生しました");
                }
            }
        }


        //2.売上ファイルの読み込み
        try {
            File f = new File(args[0]);
            File[] list = f.listFiles();
            for(int i = 0; i < list.length; i++) {
                if(list[i].getName().matches("[0-9]{6}.rcd")) {

                    BufferedReader b = new BufferedReader(new FileReader(list[i]));
                    System.out.println(b.readLine());
                    String[] box =  b.readLine().split("\n");
                    Long Salce = Long.valueOf(box[0]);
                    branchEarnings.put(box[0], Salce);
                    System.out.println(branchEarnings.get(box[0]));
                } else {
                    System.out.println("");
                        }
                }
            } catch(IOException e) {
                System.out.println("");

            } finally {
                if(br != null) {
                    try {
                        br.close();
                        System.out.println("");
                    }
                }
            }

        //集計
        try {
            File outFile = new File(args[0], "uriage");
            BufferedWriter fw = new BufferedWriter(new FileWriter(outFile));

            for(Map.Entry<String, String> entry : branchName.entrySet()) {

                fw.write(entry.getKey() + "," + entry.getValue() + "," + branchEarnings.get(entry.getKey()));
                fw.newLine();
            }
            fw.close();
        } catch(IOException e) {
            e.printStackTrace();
            System.out.println("");
        } finally {
            if(br != null) {
                try {
                br.close();
                } catch(IOException e) {
                    System.out.println("");
                }
            }
        }
    }
}

よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2020/06/16 11:29

    売り上げファイル読み込み終了後、
    System.out.println(branchEarnings);
    するとどうなりますか?

    キャンセル

  • neroS2eng

    2020/06/16 13:24

    0のまま変化なしでしたが、コンソールの出力が

    001,大阪
    002,山口
    003,福岡
    004,東京
    005,静岡
    001
    {山口=0, 大阪=0, 43000000=43000000, 福岡=0, 東京=0, 静岡=0}
    002
    {山口=0, 大阪=0, 43000000=43000000, 65400000=65400000, 福岡=0, 東京=0, 静岡=0}
    003
    {山口=0, 大阪=0, 120000=120000, 43000000=43000000, 65400000=65400000, 福岡=0, 東京=0, 静岡=0}
    004
    {山口=0, 大阪=0, 120000=120000, 43000000=43000000, 65400000=65400000, 5789000=5789000, 福岡=0, 東京=0, 静岡=0}

    となったので、やはりキーの間違いかもしれません。。

    キャンセル

回答 2

check解決した方法

0

自己解決出来ました!
売上ファイルの読み込み部分にb.readLine()を2回使っていることが原因でした。
また、for文を使っているのに配列に格納して繰り返させようとしていたのも違っていました。

        //2.売上ファイルの読み込み
        try {
            File f = new File(args[0]);
            File[] list = f.listFiles();
            for(int i = 0; i < list.length; i++) {
                if(list[i].getName().matches("[0-9]{8}.rcd")) {
                    BufferedReader b = new BufferedReader(new FileReader(list[i]));

                    String box =  b.readLine();
                    Long box2 = Long.valueOf(b.readLine());
                    branchEarnings.put(box, box2);
                    System.out.println(branchEarnings);

お二方とも本当にありがとうございました!

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

キーの指定間違いかと思いましたが違わなそうなので

ここだけ見たらキーが違いそうですけど。。。

    Long Salce = Long.valueOf(box[0]);
    branchEarnings.put(box[0], Salce);

金額をキーに金額を設定してます?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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