有人可以提供一个使用Apache commons CSVParser类读取CSV文件的示例吗?我看到无数的例子使用了过时的(我认为)无法找到的API。
我看到的每个地方,我都看到了:
File csvData = new File("/path/to/csv");
CSVParser parser = CSVParser.parse(csvData, CSVFormat.RFC4180);
for (CSVRecord csvRecord : parser) {
...
}
但我无处可寻找具有CSVParser.parse()方法的jar文件,该方法接受这些参数。采用File对象的那个,在它之后也带有一个Charset参数。在我看到API的所有地方都描述了字面上似乎并不存在。我猜测它是一个1.0之前的API,它们在1.0发布后就删除了。我试过1.0,1.1。和我的pom文件依赖项中的1.2,但它们都有Charset参数的方法。
答案 0 :(得分:11)
我最后这样做了:
CSVParser csvFileParser = CSVFormat.DEFAULT.parse(new FileReader(new File("/path/to/csv")));
我仍然认为所有文章和官方apache文档都会显示使用似乎不存在的方法的示例。
答案 1 :(得分:1)
老实说,我只能找到一个使用 CSVParser()的参考文献,就像你在示例代码中显示的那样,那是在某个小博客中。我认为这是错误的,但要求提交人澄清并不会有什么坏处。我认为你已经尝试过这些代码并没有成功,因此它有一个墓碑,它可能是一个使用 CSVParser.parser()方法的错误例子。我从来没有尝试过这个例子,因此无论如何我都无法做出真正的判断,我可以发表意见。
我个人而言,对于解析CSV文件所需的内容,我会创建自己的方法,但如果您坚持使用 Apache Commons CSVParser (经过充分测试并证明可靠的代码),那么使用 CSVParser.parser()方法的FilerReader版本。
如果您尝试解析的CSV文件是标准逗号分隔符(RFC4180),则可以使用 BufferReader 以及 String.split()方法解析每个文件行中的数据,类似于这个完整的Java runnable中显示的内容。请注意 readCSV()方法:
package csv.parser;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class CSVParser {
public static void main(String[] args) {
try {
List list = readCSV("MyCSVFile.csv");
// Display the list contents to console output.
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
catch (IOException ex) { System.out.println(ex.getMessage()); }
}
public static List readCSV(String csvFilePath, boolean... ignoreHeader) throws FileNotFoundException, IOException {
boolean useHeader = true;
if (ignoreHeader.length != 0) { useHeader = ignoreHeader[0]; }
List list = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader(csvFilePath));
// Reading header. Ignoring the contents if false was supplied to ingnoreHeader.
String line = br.readLine();
String[] fieldTitles = {};
if (useHeader) { fieldTitles = line.split(","); }
while ((line = br.readLine()) != null) {
if (!line.trim().isEmpty()) {
String[] fields = line.split(",");
String strg = "";
for (int i = 0; i < fields.length; i++) {
if (useHeader) {
if (strg.equals("")) { strg = fieldTitles[i] + ": " + fields[i]; }
else { strg+= " | " + fieldTitles[i] + ": " + fields[i]; }
}
else {
if (strg.equals("")) { strg = "Field " + (i+1) + ": " + fields[i]; }
else { strg+= " | Field " + (i+1) + ": " + fields[i]; }
}
}
list.add(strg);
}
}
br.close();
return list;
}
}
在 readCSV()方法中根据需要格式化传入的字符串数据。名为 MyCSVFile.csv 的简单CSV文本文件将包含以下内容:
NAME,CAPITAL,CURRENCY
India,New Delhi,INR
USA,Washington,USD
England,London,GBP
Japan,Tokyo,JPY
文件的第一行当然是数据标题。