首页 > 解决方案 > Java- 从 .csv 文件读取并计算 avg

问题描述

如何读取具有 x 行数和 y 列数的 .csv Excel 文件,忽略不相关的单元格(例如名称或空单元格),然后计算相关单元格中数字的平均值?

我设法读取了一个简单的 txt 文件,如下所示:
我设法读取了一个简单的 txt 文件,它看起来像这样

工作正常,我得到了我需要的所有相关信息,但是当我尝试从 .csv 文件中获取数据时,它返回 IOException

这是 .csv 文件:
这是 .csv 文件

public class Main {

    /**
     * Station name, read from input file
     */
    private static String stationid = null;

    /**
     * Set of records, read from input file
     */
    private static ArrayList<StationRecord> records = new ArrayList<>();


    /**
     * @param year
     */
    public static void listMaxWindByYear(int year) {
        records.sort((o1, o2) -> (o2.getMaxWind() - o1.getMaxWind()));

        System.out.println("Max Wind by the Station during " + year);
        System.out.printf("%-40s%-15s%-20s\n", "Station Name", "Max Wind", "Date");
        System.out.printf("%-40s%-15s%-20s\n", "------------", "--------", "----");

        int maxWind = records.get(0).getMaxWind();
        for (StationRecord record : records) {
            if (record.getMaxWind() == maxWind) {
                System.out.printf("%-40s%-15d%-20s\n", stationid, record.getMaxWind(),
                                  record.getMonth() + " " + record.getDay() + ", " + record.getYear());
            } else {
                break;
            }
        }

        System.out.println();
    }

   
    public static void listMinWindByYear(int year) {
        records.sort((o1, o2) -> (o1.getMinWind() - o2.getMinWind()));

        System.out.println("Min Wind by the Station during " + year);
        System.out.printf("%-40s%-15s%-20s\n", "Station Name", "Min Wind", "Date");
        System.out.printf("%-40s%-15s%-20s\n", "------------", "--------", "----");

        int minWind = records.get(0).getMinWind();
        for (StationRecord record : records) {
            if (record.getMinWind() == minWind) {
                System.out.printf("%-40s%-15d%-20s\n", stationid, record.getMinWind(),
                                  record.getMonth() + " " + record.getDay() + ", " + record.getYear());
            } else {
                break;
            }
        }

        System.out.println();
    }

    
    public static double calculateAverageOfAverageWindByYear(int year) {
        double total = 0;
        int numRecords = 0;

        for (StationRecord record : records) {
            if (record.getYear() == year) {
                total += record.getAverageWind();
                numRecords++;
            }
        }

        if (numRecords == 0) {
            return 0;
        }

        return total / numRecords;
    }


    /**
     *
     * @param args Unused arguments
     */
    public static void main(String[] args) {
        Locale.setDefault(Locale.US);
        File inputFile = null;
        Scanner menuScanner = new Scanner(System.in);
        while (true) {
            try {
                System.out.println("Please, enter input file name:");
                inputFile = new File(menuScanner.nextLine());
                parseFile(inputFile);
                menuScanner.close();
                                break;
            } catch (IOException ioe) {
                System.out.println("File Name you entered is not relevant");
            }
        }

        System.out.println();

        
       
        listMaxWindByYear(2019);

       
        listMinWindByYear(2019);

        
        double overallAverageTemp = calculateAverageOfAverageWindByYear(2019);
        System.out.println(stationid + " average Wind: " + String.format("%.1f", overallAverageTemp));
        System.out.println();
    }

    private static void parseFile(File file) throws IOException {
        Scanner scanner = null;
        try {
            scanner = new Scanner(file);
            stationid = scanner.nextLine();
            while (scanner.hasNextLine()) {
                records.add(new StationRecord(scanner.nextLine()));
            }
            scanner.close();

        } catch (InputMismatchException e) {
            scanner.close();
            throw new IOException();
        } catch (NoSuchElementException e) {
            scanner.close();
            throw new IOException();
        }


    }

所以总结一下它打算做什么,阅读带有风速列表最大值和最小值的列,并计算屏幕或文件上的平均打印(只能在妈妈处进行屏幕打印)。下一步是计算每年的月平均值、最小值、最大值并打印到文件。

我希望这是可以理解的,并且我可以得到帮助,我对 java 真的很陌生,每一个帮助都将不胜感激。如有必要,请随时编辑我的代码或讲座。

标签: javaarrayscsv

解决方案


推荐阅读