通过Java中的标头解析特定列

时间:2016-01-20 02:24:46

标签: java parsing csv header

这就是我的CSV文件:

 X, X2, Symbol, Date, Open, High, Low, Close, Volume

 5, 9, AAPL, 01-Jan-2015, 110.38, 110.38, 110.38, 110.38, 0
 2710, 289,  AAPL, 01-Jan-2015, 110.38, 110.38, 110.38, 110.38, 0
 5415, 6500, AAPL, 02-Jan-2015, 111.39, 111.44, 107.35, 109.33, 53204600

如何仅从X和X2列中选择值?我一直在尝试使用openCSV库,但没有任何好处。

由于

2 个答案:

答案 0 :(得分:0)

您可以使用相同的openCSV库功能: CsvToBean 。 您可以创建一个bean类,其属性与列名相同,然后使用此CSVtoBean来解析bean List,如下所示。

openCSV的例子:

ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);

CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);

@src:http://opencsv.sourceforge.net/ 可以查看/ test / java / com / opencsv / bean / 目录下每个可用映射策略的测试用例。

答案 1 :(得分:0)

uniVocity-parsers可以非常轻松地完成此任务,并且比OpenCSV快2倍。

以下是如何使用它来选择感兴趣的列:

输入

    String input = "X, X2, Symbol, Date, Open, High, Low, Close, Volume\n" +
            " 5, 9, AAPL, 01-Jan-2015, 110.38, 110.38, 110.38, 110.38, 0\n" +
            " 2710, 289,  AAPL, 01-Jan-2015, 110.38, 110.38, 110.38, 110.38, 0\n" +
            " 5415, 6500, AAPL, 02-Jan-2015, 111.39, 111.44, 107.35, 109.33, 53204600";

配置

    CsvParserSettings settings = new CsvParserSettings(); //many options here, check the tutorial
    settings.setHeaderExtractionEnabled(true); //tells the parser to use the first row as the header row
    settings.selectFields("X", "X2"); //selects the fields 

解析

    CsvParser parser = new CsvParser(settings);
    List<String[]> allRows = parser.parseAll(new StringReader(input));

打印结果

    for(String[] row : allRows){
        System.out.println(Arrays.toString(row));
    }
}

输出

[5, 9]
[2710, 289]
[5415, 6500]

在字段选择中,您可以使用任何字段序列,并且具有不同列大小的行,并且解析器将处理此问题。

披露:我是这个图书馆的作者。它是开源和免费的(Apache V2.0许可证)