通过 Java 中的 header 解析特定列
parse a specific column by its header in Java
这是我的 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
我如何才能 select 仅来自 X 和 X2 列的值?我一直在尝试使用 openCSV 库,但一无所获。
谢谢
您可以使用相同的 openCSV 库功能:CsvToBean。
您可以创建一个属性与列名相同的 bean class,然后使用此 CSVtoBean 解析出 bean 列表,如下所示。
来自 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/目录下每个可用映射策略的测试用例
uniVocity-parsers 可以非常轻松地做到这一点,而且比 OpenCSV 快 2 倍。
以下是如何使用它来 select 感兴趣的列:
输入
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]
在字段 selection 上,您可以使用任何序列的字段,并且行具有不同的列大小,解析器将处理得很好。
披露:我是这个图书馆的作者。它 open-source 并且免费(Apache V2.0 许可)
这是我的 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
我如何才能 select 仅来自 X 和 X2 列的值?我一直在尝试使用 openCSV 库,但一无所获。
谢谢
您可以使用相同的 openCSV 库功能:CsvToBean。 您可以创建一个属性与列名相同的 bean class,然后使用此 CSVtoBean 解析出 bean 列表,如下所示。
来自 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/目录下每个可用映射策略的测试用例
uniVocity-parsers 可以非常轻松地做到这一点,而且比 OpenCSV 快 2 倍。
以下是如何使用它来 select 感兴趣的列:
输入
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]
在字段 selection 上,您可以使用任何序列的字段,并且行具有不同的列大小,解析器将处理得很好。
披露:我是这个图书馆的作者。它 open-source 并且免费(Apache V2.0 许可)