在java中将CSV文件从非常大的源解析为数组
我有一个解析器,可以很好地处理大约60000行或更少的较小文件,但我必须解析一个超过1000万行的CSV文件,这种方法不起作用。它每10万行挂起10秒,我假设它是拆分方法,有没有更快的方法将数据从CSV解析到字符串数组 有关守则:在java中将CSV文件从非常大的源解析为数组,java,parsing,csv,optimization,Java,Parsing,Csv,Optimization,我有一个解析器,可以很好地处理大约60000行或更少的较小文件,但我必须解析一个超过1000万行的CSV文件,这种方法不起作用。它每10万行挂起10秒,我假设它是拆分方法,有没有更快的方法将数据从CSV解析到字符串数组 有关守则: String[][] events = new String[rows][columns]; Scanner sc = new Scanner(csvFileName); int j = 0; while (sc.hasNext())
String[][] events = new String[rows][columns];
Scanner sc = new Scanner(csvFileName);
int j = 0;
while (sc.hasNext()){
events[j] = sc.nextLine().split(",");
j++;
}
根据经验,使用库通常比内部开发更有效。有几个库提供读取/解析csv文件。其中一个比较流行的是您的代码无法可靠地解析CSV文件。如果值中有“,”或行分隔符怎么办?这也很慢 开始解析你的文件。它比ApacheCommonsCSV快3倍,具有更多的功能,我们使用它来处理数十亿行的文件 要将所有行解析为字符串列表,请执行以下操作:
CsvParserSettings settings = new CsvParserSettings(); //lots of options here, check the documentation
CsvParser parser = new CsvParser(settings);
List<String[]> allRows = parser.parseAll(new FileReader(new File("path/to/input.csv")));
CsvParserSettings设置=新的CsvParserSettings()//这里有很多选项,请查看文档
CsvParser parser=新的CsvParser(设置);
List allRows=parser.parseAll(新文件读取器(新文件(“path/to/input.csv”));
披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)。您可能想尝试我刚刚发布的库:
它在运行时使用ASM动态生成CSV解析器+数据绑定,以提高性能 您确定要同时在内存中保留这么多条目吗?