2015-11-06 222 views
0

如何讀取x行數和y列數的.csv excel文件,忽略不相關的單元格(如名稱之類的東西),然後計算每個數字的平均值柱?從.csv excel文件讀取並計算平均值

Excel的我已經是這樣的(,表明新的單元格):

ID, week 1, week 2, week 3, .... , week 7 
0 , 1 , 0.5 , 0 ,  , 1.2 
1 , 0.5 , 1 , 0.5 ,  , 0.5 
y , ...... 

這樣,我怎麼做它,所以它讀取那種.csv文件,然後計算格式周的平均1 =(第1周平均),第2周=(第2周平均)所有周?

另外我正確的假設我需要使用二維數組呢?

編輯 這裏是我的代碼,到目前爲止,這是非常粗糙的,我不知道,如果它做的事情妥善尚未:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class ClassAverage { 
    public static void main(String[] args){ 
     readFile2Array("attendance.csv"); 
    } 
    public static double[][] readFile2Array(String fileName){ 
     try { 
      int rowCount = 0; 
      int colCount = 0; 

      Scanner rc = new Scanner(new File("attendance.csv")); 
      while (rc.hasNextLine()) { 
       rowCount++; 
       rc.nextLine(); 
      } 
      rc.close(); 
      System.out.println(rowCount); 

      Scanner cc = new Scanner(new File("attendance.csv")); 
      while (cc.hasNext()) { 
       colCount++; 
       cc.next(); 
      } 
      cc.close(); 

      colCount = colCount/rowCount; 

      System.out.println(colCount); 

      Scanner sc = new Scanner(new File("attendance.csv")); 
      double[][] spreadSheet = new double[rowCount][colCount]; 
      while (sc.hasNext()) { 
       for (int i=0; i<spreadSheet.length; ++i){ 
        for (int j=0; j<spreadSheet[i].length; ++j){ 
         spreadSheet[i][j] = Double.parseDouble(sc.next()); 
        } 
       } 
      } 
      sc.close(); 
      return spreadSheet; 

     } catch (FileNotFoundException e) { 
      System.out.println("File cannot be opened"); 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    public static double weeklyAvg(double[][] a){ 

    } 
} 

那麼什麼它旨在總結做

readFile2Array:讀取csv文件並計算行數,然後計算單元總數,按行數除總單元數以查找列數。再次讀取並將每個單元格放入2D數組中的正確位置。

weeklyAvg:我還沒有想過這樣做的方法,但它應該按列讀取數組列,然後計算每列的平均值,然後打印出結果。

PS。我對Java非常陌生,所以我不知道一些建議是什麼意思,所以我真的很感謝那些純粹的基於Java而沒有插件和東西的建議(我不確定這是甚麼人的建議)。我希望它沒有太多要求(如果甚至可能的話)。

+0

到目前爲止,您是否嘗試過任何方法?請分享你的努力。 – Bikku

+0

二維數組是一種這樣做的方法,但您也可以使用一維數組來完成。 –

+0

如果人們有一些相關的**代碼**可以幫助你更容易地幫助你 - 請告訴我們你到目前爲止嘗試過的東西 – 0X0nosugar

回答

0

您可以使用Java庫來處理您的CSV文件。例如opencsv(你可以在這裏找到最新的Maven版本http://mvnrepository.com/artifact/com.opencsv/opencsv/3.5

然後你就可以分析您的文件是這樣的:通過增加

CSVReader reader = new CSVReader(new FileReader("PATH_TO_YOUR_FILE")); 
    String[] nextLine; 
    int counter = 0; 
    while ((nextLine = reader.readNext()) != null) { 
     // nextLine[] is an array of values from the line 
     System.out.println(nextLine[0] + nextLine[1]); 
    } 

你必須忽略標題行,你可以簡單地這樣做一個計數器並跳過零值。 要計算平均值,您可以使用哈希表,其中鍵是列標題名稱(例如第1周)。然後用當前行值遞增,循環完成後除以行數(不要忘記減去標題行等忽略的行)

+0

要檢查你的值是否爲double,你可以簡單地使用Double.parseDouble靜態方法並捕獲NumberFormatException。更優雅的方式是定義一個可接受的值的正則表達式 –

+0

有沒有辦法做到這一點沒有CSVReader?我不知道maven是什麼:\ – Win

0

要解析簡單的CSV文件,這很簡單通過它手動解析,只要你知道格式是整個文件相同,它不包含錯誤

  1. 創建要計算每列存儲數據結構(使用LinkedList<String>
  2. 通過CSV文件逐行讀取BufferedReader
  3. 使用String.split(',')在每一行,並返回數組中通過LinkedLists在末尾添加特定的列到正確的LinkedList
  4. 環路和(使用Double.parseDouble()到字符串雙打轉換)

要計算你的平均值確保你試圖解析的字符串是雙精度字符串,你可以使用try-catch語句或使用正則表達式。請查詢Java: how to check that a string is parsable to a double?以獲取更多信息