package project.rainanalyser.alpha; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Map; import java.util.TreeMap; public class RainfallAnalyzer { private static final String[] FILES = { "data/Copperlode_Dam_Data.csv", "data/Kuranda_Railway_Data.csv", "data/MountSheridanStationCNS.csv", "data/Tinaroo_Falls_Dam_Data.csv" }; private static final String OUTPUT_FILE_NAME = "output/output.csv"; private static final String HEADER = "Year,Month,Total Rainfall,Minimum Daily Rainfall,Maximum Daily Rainfall"; public static void main(String[] args) { processRainfallData(FILES, OUTPUT_FILE_NAME); } public static void processRainfallData(String[] files, String outputFileName) { Map monthlyRainfallTotal = new TreeMap<>(); Map minDailyRainfall = new TreeMap<>(); Map maxDailyRainfall = new TreeMap<>(); for (String file : files) { processFile(file, monthlyRainfallTotal, minDailyRainfall, maxDailyRainfall); } writeDataToFile(outputFileName, monthlyRainfallTotal, minDailyRainfall, maxDailyRainfall); } private static void processFile(String file, Map monthlyRainfallTotal, Map minDailyRainfall, Map maxDailyRainfall) { try (BufferedReader reader = new BufferedReader(new FileReader(file))) { skipHeaderLine(reader); String line; while ((line = reader.readLine()) != null) { String[] data = line.split(","); if (data.length >= 7) { String year = data[2].trim(); String month = data[3].trim(); String rainfall = data[5].trim(); if (isValidRainfallData(rainfall)) { double rainfallAmount = Double.parseDouble(rainfall); String monthKey = year + "-" + month; updateMaps(monthKey, rainfallAmount, monthlyRainfallTotal, minDailyRainfall, maxDailyRainfall); } } } } catch (FileNotFoundException e) { System.err.println("File not found: " + file); } catch (IOException e) { System.err.println("Error reading file: " + file); } catch (NumberFormatException e) { System.err.println("Error parsing rainfall data in file: " + file); } } private static void skipHeaderLine(BufferedReader reader) throws IOException { reader.readLine(); // Skip the header line } private static void updateMaps(String monthKey, double rainfallAmount, Map monthlyRainfallTotal, Map minDailyRainfall, Map maxDailyRainfall) { monthlyRainfallTotal.merge(monthKey, rainfallAmount, Double::sum); minDailyRainfall.merge(monthKey, rainfallAmount, Double::min); maxDailyRainfall.merge(monthKey, rainfallAmount, Double::max); } private static void writeDataToFile(String outputFileName, Map monthlyRainfallTotal, Map minDailyRainfall, Map maxDailyRainfall) { try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName))) { writer.write(HEADER); writer.newLine(); for (Map.Entry entry : monthlyRainfallTotal.entrySet()) { String[] parts = entry.getKey().split("-"); String year = parts[0]; String month = parts[1]; double total = entry.getValue(); double min = minDailyRainfall.get(entry.getKey()); double max = maxDailyRainfall.get(entry.getKey()); writer.write(year + "," + month + "," + total + "," + min + "," + max); writer.newLine(); } } catch (IOException e) { System.err.println("Error writing to file: " + outputFileName); } } private static boolean isValidRainfallData(String rainfall) { return !rainfall.isEmpty() && !rainfall.equals("NaN"); } }