【发布时间】:2016-07-20 08:36:49
【问题描述】:
我想读取一个包含数百万行的 csv 文件,并将这些属性用于我的决策树算法。我的代码如下:
String csvFile = "myfile.csv";
List<String[]> rowList = new ArrayList();
String line = "";
String cvsSplitBy = ",";
String encoding = "UTF-8";
BufferedReader br2 = null;
try {
int counterRow = 0;
br2 = new BufferedReader(new InputStreamReader(new FileInputStream(csvFile), encoding));
while ((line = br2.readLine()) != null) {
line=line.replaceAll(",,", ",NA,");
String[] object = line.split(cvsSplitBy);
rowList.add(object);
counterRow++;
}
System.out.println("counterRow is: "+counterRow);
for(int i=1;i<rowList.size();i++){
try{
//this method includes many if elses only.
ImplementDecisionTreeRulesFor2012(rowList.get(i)[0],rowList.get(i)[1],rowList.get(i)[2],rowList.get(i)[3],rowList.get(i)[4],rowList.get(i)[5],rowList.get(i)[6]);
}
catch(Exception ex){
System.out.printlnt("Exception occurred");
}
}
}
catch(Exception ex){
System.out.println("fix"+ex);
}
当 csv 文件的大小不大时,它可以正常工作。不过,确实很大。因此,我需要另一种更快地读取 csv 的方法。有什么建议吗?欣赏,谢谢。
【问题讨论】:
-
您连续使用了两个隐藏的正则表达式(
replaceAll和split)。由于您的 CSV 如此简单,我建议您使用拆分器,例如 Guava'sSplitter,它确实可以按预期完成工作(不像split,它有很多问题)。此外,尽管它很简单,但您如何确定您的方法ImplementDecisionTreeRulesFor2012不是您运行缓慢的根本原因? -
也许图书馆可以满足您的需求。我看到这里有一个比较:github.com/uniVocity/csv-parsers-comparison
-
为什么需要 2 个循环和
rowList来支持它们?为什么没有一个循环读取一行并将其传递给ImplementDecisionTreeRulesFor2012?