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

时间:2014-02-26 09:07:04

标签: java csv max min

如何在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

我所做的是,我遍历每一行并将每一列存储在一个hashmap

{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));
}

但是当大数据出现时,在hashmap中保存那么多数据并不是更好 然后找到最小值和最大值 如何以其他方式找到最小/最大值。

更新

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] );
  }
}

没有得到预期的结果。

解决方案Calculating min and max of columns in a csv file

4 个答案:

答案 0 :(得分:1)

  1. 根据“,”
  2. 拆分()每一行 使用split()后得到数组中的
  3. ,忽略/删除最后一个单元格/索引。
  4. 对数组进行排序。
  5. 在排序数组中,获取最小值和最大值。
  6. 将步骤1-4放入循环中,直到 - “文件中有更多行”。 快乐的编码。

答案 1 :(得分:1)

如果您关心大量数据,则应尽可能地内联该过程。

在您的情况下,您有一个分为两个项目的来源。一条线和元素。您可以使用课程Scanner

    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();

答案 2 :(得分:1)

你可以这样做:

  • 使用Stream阅读文件。
  • 逐行读取数据。
  • 拆分列。
  • 创建一个计算最大值和最小值的方法。

所以看起来像这样:

    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();
            }
        }
    }

然后创建一个计算min和max

的方法
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;
            }
    }
}

答案 3 :(得分:1)

为什么在重新划分线时找到每个单元格的最大/最小值时创建一个数组/列表/集?

  1. 读一行
  2. 拆分
  3. 将单元格转换为double并检查min / max
  4. 下一行
  5. 只有一个cicle你有你的结果。您还可以将结果存储到array / list / set中以供其他详细说明,但这不是必需的(并且速度很慢,因为如果文件大小在开头不知道,则数组/列表/集可能必须多次调整大小,也是RAM大小将很大,所有数据与每个单元的最小/最大变量相比)