Получить количество столбцов с помощью OpenCSV

У меня есть текстовый файл, и я хочу подсчитать количество столбцов. (использую openCSV)

public class demoTable {
    public demoTable(){
         read();
        JOptionPane.showMessageDialog(null, "number of columns inside file: " + getNumberOfColumnsFromFile(), null, JOptionPane.INFORMATION_MESSAGE);
    close();
    }

    private void read(){
    try {
        this.fileInputStream = new FileInputStream("D:\\Book3.txt");
        UTF8_CHARSET = StandardCharsets.UTF_8.newDecoder();
        UTF8_CHARSET.onMalformedInput(CodingErrorAction.REPLACE);
        this.fileReader = new InputStreamReader(this.fileInputStream, UTF8_CHARSET);
        this.reader = new CSVReader(this.fileReader, '\t');
    } 
    catch (FileNotFoundException ex) {
        Logger.getLogger(VJTable.class.getName()).log(Level.SEVERE, null, ex);
    }
    }

    private int getNumberOfColumnsFromFile(){
    //Estimating number of rows from file (Googled that).
    this.numberOfColumns = 0;
    try {
        while( (this.nextLine = this.reader.readNext()) != null){
            this.numberOfColumns++;
        }
    } 
    catch (IOException ex) {
        Logger.getLogger(VJTable.class.getName()).log(Level.SEVERE, null, ex);
    }
    return this.numberOfColumns;
   }

   private void close(){
    try {
        this.fileInputStream.close();
        this.fileReader.close();
        this.reader.close();
    }
    catch (IOException ex) {
        Logger.getLogger(VJTable.class.getName()).log(Level.SEVERE, null, ex);
    }
    }
}

К сожалению, метод getNumberOfColumnsFromFile() возвращает количество строк вместо столбцов. Не могли бы вы сказать мне, что я не делаю хорошо здесь? Заранее спасибо.


person Vassilis De    schedule 09.08.2014    source источник
comment
@user2864740 user2864740 Я, честно говоря, не знаю... это странно, но именно так они сделали это на веб-сайте...   -  person Vassilis De    schedule 09.08.2014
comment
@peeskillet ну, вначале я использовал split, но потом решил использовать openCSV для таких заданий...   -  person Vassilis De    schedule 09.08.2014


Ответы (1)


Метод CSVRearder.readNext() возвращает String[], где каждый столбец/значение является элементом:

Считывает следующую строку из буфера и преобразует в массив строк [..], где каждый элемент, разделенный запятыми, является отдельной записью.

Таким образом,

String[] header = this.reader.readNext(); // assuming first read
if (header != null) {                     // and there is a (header) line
   int columnCount = header.length;       // get the column count
}
person user2864740    schedule 09.08.2014
comment
@VassilisDe Добро пожаловать! Помните, что он читает за строкой. - person user2864740; 09.08.2014
comment
Боюсь, я не понял этого... не могли бы вы объяснить мне? - person Vassilis De; 09.08.2014
comment
Может быть, немного поздно, но я думаю, что @user2864740 имел в виду, что когда вы читаете следующую строку из буфера, ваш указатель перемещается за эту строку. Скажем, вы используете этот фрагмент для получения количества столбцов вашего csv, в следующий раз, когда вы вызовете readNext(), вы получите вторую строку. Если ваша первая строка не является строкой заголовка с именами полей и содержит фактические данные, вы должны учитывать это поведение. - person KevinD; 09.06.2016