如何在java中从大型csv文件中随机读取整行(包括可能的换行符)
我有一个很大的CSV文件,它的大小不具体,可能超过4GB。 我需要从文件中随机读取一些行作为测试用例,以便在应用程序中执行一些测试 无法读取内存中的完整文件,因为它将引发如何在java中从大型csv文件中随机读取整行(包括可能的换行符),java,csv,random,Java,Csv,Random,我有一个很大的CSV文件,它的大小不具体,可能超过4GB。 我需要从文件中随机读取一些行作为测试用例,以便在应用程序中执行一些测试 无法读取内存中的完整文件,因为它将引发OutOfMemoryError异常 一种解决方案是生成一个包含总数范围内的一些数字的数组,然后对列表进行排序。 最后根据数组中存储的数字逐行读取文件。所以我可以从csv文件中随机获得一组完整的行 是否有库或方法从大csv文件中随机读取整行 一个解决方案: // generate random numbers List<I
OutOfMemoryError
异常
一种解决方案是生成一个包含总数范围内的一些数字的数组,然后对列表进行排序。
最后根据数组中存储的数字逐行读取文件。所以我可以从csv文件中随机获得一组完整的行
是否有库
或方法
从大csv
文件中随机读取整行
一个解决方案:
// generate random numbers
List<Integer> indexList = new ArrayList<>();
for (int i = 0; i < testCount; i++) {
int random = faker.numberBetween(0, total);
indexList.add(random);
}
// sort
Collections.sort(indexList);
// read from a file
List<String> list = new ArrayList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.csv"), "UTF-8"));
String line;
int lineNum = 0;
int pos = 0;
int currentNum = indexList.get(pos);
while ((line = reader.readLine()) != null) {
while (currentNum == lineNum) {
list.add(line);
pos++;
if (pos == testCount)
break;
currentNum = indexList.get(pos);
}
if (pos == testCount)
break;
lineNum++;
}
reader.close();
//生成随机数
列表索引列表=新的ArrayList();
对于(int i=0;i
是我想到的一种算法。这样做的好处是,您不需要知道有多少项,也不必将整个文件读入内存;只要有必要,就下一行。请添加您为简化解决方案过程而实施的尝试和代码。不要忘记使用-Xms variable以更高的堆内存初始化JVM。您还可以生成一个介于0(包括)和文件大小之间的随机数p
。然后seek
(例如使用)到文件中的p
位置。从那里,扫描下一个EOL,然后读取并返回以下行。您可以生成随机数组,创建一个BufferedReader并跳到每个随机数。可能比逐行阅读快。可能重复