0

我只是想知道,您可以阅读纺织品,还是必须将文本文件导入 java(如字符串或数组列表)才能使用文本文件中的信息。

例如,我有一个看起来与此类似的文件

1  34  12  43  65
1  44  8   45  77
2  34  10  56  87
6  43  6   76  89
6  65  7   23  90

其中向下的每一列代表某些东西(可能第一列是项目 ID,第二列是价格,第三列是月份)。然后假设我有 20GB 的信息以这种方式布局。我可以使用 java 对这些信息进行数据汇总,还是文件太大了?我尝试将 20gb 文件作为 ArrayList 导入,但在等待 10 分钟后,arraylist 仍在填充,我放弃了。

我在想,如果我可以直接与文件交互而不是将其作为数组列表导入,它可能会起作用。

4

2 回答 2

1

您当然可以使用 Java 来总结这些信息。例如,如果您的目标是计算每列的最小值、最大值和平均值,您可以编写如下内容:

final BufferedReader br =
    new BufferedReader(new FileReader("/this/is/the/path/to/the/file.txt"));
final int[] mins = { Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE,
                     Integer.MAX_VALUE, Integer.MAX_VALUE };
final int[] maxes = { Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE,
                      Integer.MIN_VALUE, Integer.MIN_VALUE };
final double[] sums = { 0.0, 0.0, 0.0, 0.0, 0.0 };
int count = 0;
try {
    String line;
    while((line = br.readLine()) != null) {
        ++count;
        final String[] values = line.split("\\s+");
        for(int i = 0; i < 5; ++i) {
            final int value = Integer.parseInt(values);
            if(value < mins[i]) {
                mins[i] = value;
            }
            if(value > maxes[i]) {
                maxes[i] = value;
            }
            sums[i] += value;
        }
    }
} finally {
    br.close();
}
final double[] averages = new double[sums.length];
for(int i = 0; i < sums.length; ++i) {
    averages = sums[i] / count; 
}
System.out.println(Arrays.toString(mins));
System.out.println(Arrays.toString(maxes));
System.out.println(Arrays.toString(averages));
于 2013-06-11T20:23:50.997 回答
0

处理这么大文件的基本方法是读取一点,处理那个量,从内存中清除细节,然后循环遍历文件的其余部分做同样的事情。

我喜欢这个主意。只需阅读所有 ID 为 1 的项目,获得平均值,然后继续阅读下一个项目 ID。问题是我不知道该怎么做,也不知道有多少项目。

如果您只想要每列的平均值,我看不出这有什么问题。有 5 列,所以保留 5 个属性(例如long columnTotal11 .. columnTotal5)。将每行的值添加到相应的列 total 和 increment lineCount

在文件末尾,将每列的列总数除以行数,以获得该列的平均值。

  1. 正如所指出的,along可能不足以容纳总和,因此问题可能需要BigInteger代替。
于 2013-06-11T20:29:08.783 回答