Использование BufferedReader для подсчета строк в многомерном массиве - PullRequest
1 голос
/ 08 августа 2011

Я использую BufferedReader для чтения файла .csv.У меня нет проблем с чтением файла и извлечением данных.Однако проблема, с которой я сталкиваюсь, заключается в том, что я должен жестко закодировать объявление массива.Например:

        String[][] numbers=new String[5258][16];

Файл .csv, который я использовал, имел 5258 строк и 16 столбцов.Я хотел бы иметь возможность сделать что-то вроде этого, хотя:

        String[][] numbers=new String[rowsInFile][16];

Другими словами, я хочу, чтобы переменная 'columnsInFile' была эквивалентна количеству строк в файле (я нехочу посчитать столбцы, потому что каждый файл .csv, который я буду запускать через эту программу, имеет 16 столбцов).

Вот код, который у меня есть:

        int row = 0;
        int col = 0;

        String fileInput = JOptionPane.showInputDialog(null, 
                "Please enter the path of the CSV file to read:");

        File file = new File(fileInput);

        BufferedReader bufRdr;
        bufRdr = new BufferedReader(new FileReader(file));
        String line = null;

        //get rows in the file
        int rowsInFile = 0;
        while(bufRdr.readLine() != null) {
            rowsInFile++;
            row++;
        }
        String[][] numbers=new String[rowsInFile][16];

        //read each line of text file
        row = 0;
        while((line = bufRdr.readLine()) != null) {
            StringTokenizer st = new StringTokenizer(line,",");
            col=0;

            while (st.hasMoreTokens()) {
                //get next token and store it in the array
                numbers[row][col] = st.nextToken();
                col++;
            }
            row++;
        }

Однако я 'получаю исключение нулевого указателя.Любые идеи о том, что я должен делать?

PS Да, этот код окружен оператором try / catch.

Ответы [ 3 ]

3 голосов
/ 08 августа 2011

Проблема в том, что, как только вы один раз пройдете через BufferedReader, вы не сможете снова пройти через него. Другими словами, вы должны использовать новый BufferedReader.

bufRdr = new BufferedReader(new FileReader(file));
row = 0;
while((line = bufRdr.readLine()) != null) {

В качестве альтернативы, вы можете использовать динамическую структуру массива, такую ​​как ArrayList<String[]> или LinkedList<String[]> для хранения строк.

LinkedList<String[]> numbers = new LinkedList<String[]>();

while( (line = bufRdr.readLine()) != null ) {
    numbers.add(line.split(","));
}

Тогда вместо numbers[i][j] вы используете numbers.get(i)[j].

2 голосов
/ 08 августа 2011

Вместо массива используйте что-то динамическое, например, List.Например:

List<String[]> data = new ArrayList<String[]>();

Также использование метода String's split() упростит загрузку строки.

1 голос
/ 08 августа 2011

Ваша проблема в том, что BufferedReaders работает, читая до конца файла, а затем застревает там.Ваш код требует двойного чтения файла, но поскольку вы уже достигли EOF, BufferedReader застрял, возвращая ноль.Я склонен решать эту проблему, вставляя строки в ArrayList и используя метод size (), чтобы получить количество строк.Исходный код выглядит примерно так:

    int rowsInFile=0;
    ArrayList<String> lines = new ArrayList<String>();
    String tmp = "";
    while(tmp=bugRdr.readLine())
    {
        lines.add(tmp);
    }

    rowsInFile = lines.size();
    String[][] numbers = new String[rowsInFile][16];

    int row = 0;
    for(String line : lines)
    {
        StringTokenizer st = new StringTokenizer(line,",");
        col=0;

        while (st.hasMoreTokens()) {
        //get next token and store it in the array
            numbers[row][col] = st.nextToken();
            col++;
        }
        row++;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...