Получить заголовок файла CSV, используя Apache Commons

Последние два часа я искал решение моей проблемы напрасно. Я пытаюсь прочитать файл CSV, используя общие Apache, я могу прочитать весь файл, но моя проблема в том, как извлечь только заголовок CSV в массиве?

6 ответов

Решение

По умолчанию первая запись читается CSVParser всегда будет записью заголовка, например, в следующем примере:

CSVFormat csvFileFormat = CSVFormat.DEFAULT.withHeader(FILE_HEADER_MAPPING);
FileReader fileReader = new FileReader("file");
CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);
List csvRecords = csvFileParser.getRecords();

csvRecords.get(0) вернет заголовок записи.

I looked everywhere and even the solution above didn't work.. for anyone else with this issue, this does.

Iterable<CSVRecord> records;
Reader in = new FileReader(fileLocation);
records = CSVFormat.EXCEL.withHeader().withSkipHeaderRecord(false).parse(in);
Set<String> headers = records.iterator().next().toMap().keySet();
BufferedReader br = new BufferedReader(new FileReader(filename));

CSVParser parser = CSVParser.parse(br, CSVFormat.EXCEL.withFirstRecordAsHeader());

List<String> headers = parser.getHeaderNames();

Это сработало для меня. Последняя строка - это то, что вам нужно, извлекает заголовки, найденные парсером, в список строк.

Начиная с Apache Commons CSV v1.9.0, withSkipHeaderRecord()и withFirstRecordAsHeader()методы устарели. Предусмотрен интерфейс конструктора. Используйте его таким образом:

      CSVFormat.DEFAULT.builder()
    .setHeader()
    .setSkipHeaderRecord(true)
    .build();

В Котлине:

      val reader = File(path).bufferedReader()
val records = CSVFormat.DEFAULT.withFirstRecordAsHeader()
    .withIgnoreHeaderCase()
    .withTrim()
    .parse(reader)

println(records.headerNames)

Код ниже работает для меня:

      import java.io.FileReader;
import org.apache.commons.csv.*;

public static String[] headersInCSVFile (String csvFilePath) throws IOException {
        //reading file
        CSVFormat csvFileFormat = CSVFormat.DEFAULT;
        FileReader fileReader = new FileReader(csvFilePath);
        CSVParser csvFileParser = new CSVParser(fileReader, csvFileFormat);
        List csvRecords = csvFileParser.getRecords();
        
        //Obtaining first record and splitting that into an array using delimiters and removing unnecessary text
        String[] headers = csvRecords.get(0).toString().split("[,'=\\]\\[]+");
        String[] result = new String[headers.length - 6];
        for (int i = 6; i < headers.length; i++) {
            //.replaceAll("\\s", "") removes spaces
            result[i - 6] = headers[i].replaceAll("\\s", "");
        } 
        return result;
}
Другие вопросы по тегам