簡體   English   中英

如何在整個csv文件中查找每一列的最小值和最大值

[英]How to find min and max value for each column in the entire csv file

如何在csv文件中查找每一列的最小值和最大值(albhabet值除外)。

I want to get each columns min and max values

5.3,3.6,1.6,0.3,Iris-setosa
4.9,3.3,1.6,0.3,Iris-setosa
4.9,3.3,1.3,0.3,Iris-setosa
4.6,3.3,1.6,0.0,Iris-setosa

col 1, min = 4.6 ,max = 5.3
col 2, min = 3.3 ,max = 3.6
col 3, min = 1.3 ,max = 1.6
col 4, min = 0.0 ,max = 0.3

我所做的是,我遍歷每一行並將每一列存儲在哈希圖中

{1=[5.3,4.9,4.9,4.6],2=[3.6,3.3,3.3,3.3],3[1.6,1.6,1.3,1.6],4[0.3,0.3,0.3,0.0]}

然后我計算

for (Map.Entry<String, List<String>> entry : map.entrySet()) {      
// Iterating through values
String key = entry.getKey();
List<String> values = entry.getValue();
min = Double.parseDouble(Collections.min(values));
max = Double.parseDouble(Collections.max(values));
}

但是,當有大數據時,最好不要在哈希圖中保存那么多數據,然后找到最小值和最大值。如何以其他方式查找最小值/最大值。

更新

String line[] = value.split(delimit);
for(int i=0;i<line.length -1;i++){
 if (Double.parseDouble(line[i] ) < min) { 
   min = Double.parseDouble(line[i] );
  }
 if (Double.parseDouble(line[i] ) > max) {
  max = Double.parseDouble(line[i] );
  }
}

沒有得到預期的結果。

解決方案計算csv文件中的列的最小值和最大值

  1. 根據(,)分割()每行
  2. 從使用split()之后獲得的數組中,忽略/刪除最后一個單元格/索引。
  3. 對數組進行排序。
  4. 在排序的數組中,獲取最小值和最大值。

循環執行第1-4步,直到-“文件中有更多行”。 編碼愉快。

如果您關心大量數據,則應盡可能內聯該過程。

在您的情況下,您有一個分為兩部分的來源。 一條線和元素。 您可以使用班級掃描儀

    Scanner lineScanner = new Scanner(source);

        while(lineScanner.hasNext()) {

            Scanner elementScanner = new Scanner(lineScanner.nextLine()).useDelimiter(",");

            for(int column = 1; elementScanner.hasNextDouble(); column++) {

                double nextDouble = elementScanner.nextDouble();

                updateMax(column, nextDouble); //or updateMinMax(column,nextDouble);
                updateMin(column, nextDouble);

            }

        }

    lineScanner.close();

您可以這樣做:

  • 使用流讀取文件。
  • 逐行讀取數據。
  • 拆分列。
  • 創建一種方法來計算最大值和最小值。

所以它看起來像這樣:

    BufferedReader br = null;
    String line = "";
    String cvsSplitBy = ",";

    try {

        br = new BufferedReader(new FileReader(csvFile));
        while ((line = br.readLine()) != null) {

            // use comma as separator
            String[] columns= line.split(cvsSplitBy);

            calculateMinAndMax(columns);

        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

然后創建一種方法來計算最小和最大

private double[] maxValues = {0, 0, 0, 0};
private double[] minValues = {0, 0, 0, 0};
private void calculateMinAndMax(String[] line) {
    for (int i = 0; i < line.length; i++) {
            //check the max value
            double currentValue = Double.Double.parseDouble(line[i]);
            if(currentValue > maxValues[i] ) {
                maxValues[i] = currentValue;
            }

            //check the min value
            if(currentValue < minValues[i]) {
                minValues[i] = currentValue;
            }
    }
}

當可以找到每行單元格的最大值/最小值時,為什么還要創建一個數組/列表/集合?

  1. 讀一行
  2. 拆分
  3. 將單元格轉換為兩倍並檢查最小/最大
  4. 下一行

只需一根冰柱,您就可以得到結果。 您也可以將結果存儲到array / list / set中以進行其他詳細說明,但這不是必需的(並且很慢,因為如果一開始不知道文件大小,可能需要多次調整array / list / set的大小, RAM大小將更加龐大,所有數據與每個單元的最小/最大變量相比)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM