JAVA初心者です。
下記のような担当者別月額売上表を作成したいのですが、日付が正しいものまで
falseで返ってきてしまいます。
メソッドの使い方が間違っているのでしょうか?
解決方法を教えてください、よろしくお願いします。
【完成例】
担当者,売上日,商品名,数量,売上金額,備考
山田,20160227,チョコレート,3,300
山田,20160228,マシュマロ,1,200
山田,20160229,クッキー,1,300
山田,20160230,せんべい,2,400,日付に誤り有
201602月合計,,,,,1200
【現時点】
担当者,売上日,商品名,数量,売上金額,備考
山田,20160227,チョコレート,3,300 ,日付に誤り有
山田,20160228,マシュマロ,1,200,日付に誤り有
山田,20160229,クッキー,1,300,日付に誤り有
山田,20160230,せんべい,2,400,日付に誤り有
201602月合計,,,,,1200
package test4; 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.text.DateFormat; import java.util.HashMap; public class StaffMonthlySalesRecord { public static void main(String[] args) { BufferedReader brInputFileA= null ; //商品マスタ用 BufferedReader brInputFileM= null ; //売上明細用 BufferedWriter bwOutputFileA = null ; //月額売上表用 String stBufferM = ""; //inMファイルデータを格納 String stBufferA = ""; //inAファイルデータを格納 HashMap<String,HashMap<String,Object>> alDataM = new HashMap<String,HashMap<String,Object>>() ; //商品マスタの入力データを格納 HashMap<String, Object> mpDataM = null; String date = ""; //売上明細ファイルの購入月をセット String staff = ""; //売上明細ファイルの担当者をセット boolean isFirst = true; //0番目の売上日をセットする為の変数 boolean isFirstStaff = true; //0番目の担当者をセットする為の変数 int sum = 0; //合計金額 int allSum = 0; //月の合計金額 int cnt10 = 0; //10件を数えるカウンター final String noItem = "商品マスタ未存在"; final String nocalendar = "日付に誤りがあります"; try{ fileError:{ try{ brInputFileM = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inM.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inMファイルが見つかりません。"); break fileError; } //inMファイルデータを読み込み while((stBufferM = brInputFileM.readLine()) != null){ if(stBufferM.equals("")){ System.err.println("データに不備があります。"); break fileError; } String[] itemM = stBufferM.split(","); mpDataM = new HashMap<String,Object>(); //商品マスタ用データを分割し格納 mpDataM.put("code",itemM[0]); mpDataM.put("name",itemM[1]); mpDataM.put("price",itemM[2]); alDataM.put(itemM[0],mpDataM); }//while try{ brInputFileA = new BufferedReader(new InputStreamReader(new FileInputStream("C:/Users/temp/Desktop/inA.csv"),"JISAutoDetect")); }catch(FileNotFoundException e){ System.err.println("inA.csvファイルが見つかりません。"); break fileError; } try{ bwOutputFileA = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:/Users/temp/Desktop/outA.csv"),"SJIS")); }catch(FileNotFoundException e){ System.err.println("outA.csvファイルが見つかりません。"); break fileError; } try{ bwOutputFileA.write("担当者" + "," + "売上日" + "," + "商品名" + "," + "数量" + " ," + "売上金額" + "," + "備考"); //項目名出力 bwOutputFileA.newLine(); while((stBufferA = brInputFileA.readLine()) != null){ if(stBufferA.equals("")){ System.err.println("データに不備があります。"); break fileError; } if(stBufferA.isEmpty()){ System.err.println("inA.csvファイルは空です。"); break fileError; } String[] itemA = stBufferA.split(","); mpDataM = alDataM.get(itemA[2]); if(stBufferA.equals("")){ System.err.println("データに不備があります。"); break fileError; } if(isFirstStaff){ staff = itemA[0]; isFirstStaff = false; } if(!alDataM.containsKey(itemA[0])){ staff = itemA[0]; isFirstStaff = false; } if(isFirst){ date = itemA[1].substring(0, 6); isFirst = false; } String boughtDay = (itemA[1].substring(0, 6)); int t = boughtDay.compareTo(date); //月変更の比較 if(t > 0){ bwOutputFileA.write("*"); bwOutputFileA.newLine(); bwOutputFileA.write(date.substring(0, 6) + "月合計" + "," + "," + "," + "," + allSum); //合計金額を出力 bwOutputFileA.newLine(); String a = " "; bwOutputFileA.write(a); bwOutputFileA.newLine(); date = itemA[0]; allSum = 0; // 月の合計を0に戻す } cnt10 = cnt10 + 1; //件数カウンターに1を加算 if(cnt10 >= 10){ //件数カウンターが10件に到達した場合 String a = " "; bwOutputFileA.write(a); bwOutputFileA.newLine(); cnt10 = 0; // 件数カウンターリセット } if(alDataM.containsKey(itemA[2])){ //商品コードが一致しているか確認 String a = itemA[0]; //担当者 String b = itemA[1]; //売上日 Object c = mpDataM.get("name"); //商品名 String d = itemA[3]; //数量 String e = ""; //備考 if(checkDate(itemA[1])){ //日付の妥当性を確認 int num = Integer.parseInt(itemA[2]); int num2 = Integer.parseInt((String) d); sum = num * num2; //数量×単価=金額 allSum = sum + allSum; //月合計を算出 bwOutputFileA.write(a + "," + b + "," + c + "," + d + "," + sum + "," + e); bwOutputFileA.newLine(); }else{ e = nocalendar; //備考=日付に誤りがあります bwOutputFileA.write(a + "," + b + "," + c + "," + d + "," + sum + "," + e); bwOutputFileA.newLine(); } }else{ String a = itemA[0]; //担当者 String b = itemA[1]; //売上日 String c = noItem; //商品名=商品マスタ未存在 String d = itemA[2]; //数量 bwOutputFileA.write(a + "," + b + "," + c + "," + d); bwOutputFileA.newLine(); } }//while bwOutputFileA.write("*"); bwOutputFileA.newLine(); //bwOutputFileA.write(date.substring(0, 6) + "月合計" + "," + "," + "," + "," + allSum); //合計金額を出力 }//try catch(IOException e){ System.err.println("エラーが発生しました。"); e.printStackTrace(); } }//fileError } //try catch(IOException e){ System.err.println("エラーが発生しました。"); e.printStackTrace(); } finally{ try { if(brInputFileA != null){ brInputFileA.close(); } if(brInputFileM != null){ brInputFileM.close(); } if(bwOutputFileA != null){ bwOutputFileA.close(); } } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } } /** * 日付の妥当性をチェック * カレンダーに存在するかどうかを返す。 * @param strDate チェック対象の文字列 * @return 存在する日付の場合true */ public static boolean checkDate(String strDate) { if (strDate == null || strDate.length() != 8) { throw new IllegalArgumentException( "引数の文字列["+ strDate +"]" + "は不正です。"); } DateFormat format = DateFormat.getDateInstance(); format.setLenient(false); try { format.parse(strDate); return true; } catch (Exception e) { return false; } } }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。