我只是想知道,你能阅读纺织品还是必须将文本文件导入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仍在填充之后,我放弃了。
我在想,如果我可以直接与文件交互而不是将其作为数组列表导入,它可能会起作用。
答案 0 :(得分: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));
答案 1 :(得分:0)
使用大文件的基本方法是读取一点,处理该数量,从内存中清除细节,然后循环执行相同的文件的其余部分。
我喜欢这个主意。只需读取所有商品ID 1,获得该平均值,然后继续下一个商品ID。问题是我不知道该怎么做,也不知道有多少项。
如果您只想要每列的平均值,我看不出这是怎么回事。有5列,因此保留5个属性(例如long columnTotal1
1 .. columnTotal5
)。将每行的值添加到相应的列总计并增加lineCount
。
在文件末尾,将每列的列总数除以行数,以获得该列的平均值。
long
可能不足以容纳总和,因此问题可能需要BigInteger
。