RainfallAnalyser / src / main / java / project / rainanalyser / alpha / RainfallAnalyzer.java
RainfallAnalyzer.java
Raw
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<String, Double> monthlyRainfallTotal = new TreeMap<>();
        Map<String, Double> minDailyRainfall = new TreeMap<>();
        Map<String, Double> maxDailyRainfall = new TreeMap<>();

        for (String file : files) {
            processFile(file, monthlyRainfallTotal, minDailyRainfall, maxDailyRainfall);
        }

        writeDataToFile(outputFileName, monthlyRainfallTotal, minDailyRainfall, maxDailyRainfall);
    }

    private static void processFile(String file, Map<String, Double> monthlyRainfallTotal,
                                    Map<String, Double> minDailyRainfall, Map<String, Double> 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<String, Double> monthlyRainfallTotal,
                                   Map<String, Double> minDailyRainfall,
                                   Map<String, Double> 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<String, Double> monthlyRainfallTotal,
                                        Map<String, Double> minDailyRainfall, Map<String, Double> maxDailyRainfall) {
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFileName))) {
            writer.write(HEADER);
            writer.newLine();
            for (Map.Entry<String, Double> 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");
    }
}