选择第二列(FileReader)

时间:2016-12-21 13:47:13

标签: java csv multiple-columns bufferedreader filereader

我正在循环使用csv。我有两个问题:

1)我正在按名称选择第二列,如

if(tab[1].equals("Col2")

我不想把列的名字。我想只选择第二列。

2)如何跳过第一行(标题)

以下是循环csv的代码示例:

String csvFile = "C:\\test.csv";
BufferedReader br = null;
String line = "";
String cvsSplitBy = ";";

try{
    br = new BufferedReader(new FileReader(csvFile));

    while ((line = br.readLine()) != null) {
        String[] tab=line.split(cvsSplitBy);      

        int tmp;
        if(tab[1].equals("Col2")){                

            tmp = Integer.parseInt(tab[2]);

                for(int i=0;i<tmp;i++){  
                   // TO DO
                }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

最好为此使用CSVReader,它提供了许多用于处理csv文件的API。这是一个完整的工作代码,当然,无需例外处理。

String csvFile = "C:\\test.csv";
CSVReader reader;
String[] nextRow;
char cvsSplitBy = ';';

try {

    //Last argument will determine how many lines to skip. 1 means skip header
    reader = new CSVReader(new FileReader(csvFile), cvsSplitBy, CSVParser.DEFAULT_QUOTE_CHARACTER, 1);

    while ((nextRow = reader.readNext()) != null) {

        if(nextRow.length > 2){
            //nextRow[1] will always give second column value
            int tmp = Integer.parseInt(nextRow[1]);
            for (int i = 0; i < tmp; i++) {
                // TO DO
            }
        }
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} catch (IOException e) {
    e.printStackTrace();
}

答案 1 :(得分:0)

以下是使用Apache Commons CSV及其CSVParser

的示例

第一行被认为是标题并被跳过(withFirstRecordAsHeader()),每个记录的“列”可以使用它们的索引(get(int))进行访问。索引从0开始

只需根据您的需要调整字符集和CSVFormat

CSVParser parser = null;

try {

    parser = CSVParser.parse(new File(csvFile), Charset.forName("UTF-8"),
            CSVFormat.RFC4180.withFirstRecordAsHeader());

    List<CSVRecord> records = parser.getRecords();

    for (CSVRecord record : records) {

        int tmp = Integer.parseInt(record.get(1));

        for (int i = 0; i < tmp; i++) {
            // TO DO
        }

    }

} catch (IOException e) {

    e.printStackTrace();

} finally {
    try {
        parser.close();
    } catch (IOException e) {

    }

}

答案 2 :(得分:0)

使用univocity-parsers这会变得轻而易举:

CsvParserSettings parserSettings = new CsvParserSettings(); //many options here, check the tutorial.
parserSettings.setHeaderExtractionEnabled(true); //header is extracted and not part of the result
parserSettings.selectIndexes(1); //select 2nd column (indexes are 0-based)
CsvParser parser = new CsvParser(parserSettings);
List<String[]> allRows = parser.parseAll(csvFile);

请注意,即使某些行为空而只有一列,这也会有效,而此处发布的所有其他解决方案都将失败,除非您自己处理此类情况。

这不仅涉及更少的代码(和复杂性),解析器也比Commons CSV快〜4倍,比OpenCSV快〜3倍。

免责声明:我是这个图书馆的作者,它的开源和免费(Apache v2.0许可证)