Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中从大型csv文件中随机读取整行(包括可能的换行符)_Java_Csv_Random - Fatal编程技术网

如何在java中从大型csv文件中随机读取整行(包括可能的换行符)

如何在java中从大型csv文件中随机读取整行(包括可能的换行符),java,csv,random,Java,Csv,Random,我有一个很大的CSV文件,它的大小不具体,可能超过4GB。 我需要从文件中随机读取一些行作为测试用例,以便在应用程序中执行一些测试 无法读取内存中的完整文件,因为它将引发OutOfMemoryError异常 一种解决方案是生成一个包含总数范围内的一些数字的数组,然后对列表进行排序。 最后根据数组中存储的数字逐行读取文件。所以我可以从csv文件中随机获得一组完整的行 是否有库或方法从大csv文件中随机读取整行 一个解决方案: // generate random numbers List<I

我有一个很大的CSV文件,它的大小不具体,可能超过4GB。 我需要从文件中随机读取一些行作为测试用例,以便在应用程序中执行一些测试

无法读取内存中的完整文件,因为它将引发
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并跳到每个随机数。可能比逐行阅读快。可能重复