使用当前apache commons csv库读取CSV文件的示例

时间:2016-04-21 00:03:28

标签: java apache csv

有人可以提供一个使用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参数的方法。

2 个答案:

答案 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

文件的第一行当然是数据标题。