Чтение определенных данных с помощью буферизованного Filereader

Из текстового файла я пытаюсь получить третий набор данных (тип = двойной) подряд, а затем суммировать его, чтобы получить общее количество. Моя проблема в том, что мне трудно понять, как получить конкретный фрагмент данных из строки с помощью буферизованного считывателя файлов. Я знаю, как получить строку, но синтаксический анализ данных — загадка. Я разместил свой код ниже на случай, если он может помочь дать больше контекста. Спасибо!

РЕДАКТИРОВАТЬ: Пожалуйста, потерпите меня. Я буквально в течение первого месяца изучения Java. Я должен использовать буферизованный ридер. Это школьный проект. Я должен использовать «раскол»? Если да, могу ли я сохранить «следующий раскол» или что-то еще в массиве?

списки.txt

Int           string(?) double   int

PropertyID    Type    Cost     AgentID --(Not in the file. The file only has the data)

100000       Farm    500000.00   101

100001       Land    700000.00   104

Код

    package overview;

    import java.io.*;
    import java.util.*;
    import java.lang.*;
    import java.nio.*;

    public class Overview {

        public static void main(String[] args) throws FileNotFoundException {

            // TODO code application logic here
            int count = 0;  
            double totalCost=0.00;
            ArrayList<Double> propertyID = new ArrayList();


            //Get file name
            Scanner console = new Scanner(System.in);
            System.out.print ("Please enter file name: ");
            String inputFileName = console.next();
            File inputFile = new File(inputFileName);

            // Get the object of DataInputStream
            FileInputStream fstream = new FileInputStream(inputFile);
            DataInputStream in = new DataInputStream(fstream);


            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            String line;

            try {
                while ((line = reader.readLine()) != null) 
                {
                    double x = Double.parseDouble(line.split(" ")[]);
                    propertyID.add(x);;
                    totalCost = Double.parseDouble(line.split(" ")[8]);
                    count++;
                }
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        finally {

            System.out.println("Total properties in list: " + count + "\n"+ "The total cost is: " +totalCost);}
        }
    }

person Random-Guy77    schedule 18.05.2012    source источник
comment
Тот факт, что строка пришла из BufferedReader, не имеет значения. Это просто разбор строки данных.   -  person Jon Skeet    schedule 18.05.2012
comment
Каждая строка разделена пробелами, а третье поле является интересным полем?   -  person hmjd    schedule 18.05.2012
comment
не могли бы вы показать нам входные данные?   -  person Matten    schedule 18.05.2012
comment
Какова структура вашего файла?   -  person Tudor    schedule 18.05.2012
comment
Ваша проблема не в источнике ввода, а в том, как читать этот ввод... и тогда это зависит от структуры вашего входного файла (это CSV?)   -  person Vinze    schedule 18.05.2012
comment
Какого типа два предыдущих элемента в строке? И будет ли ваш double всегда иметь десятичную точку?   -  person Clockwork-Muse    schedule 18.05.2012


Ответы (1)


Вот пример, который работает (без файла):

private static final String data = "100000    Farm    500000.00    101\n100001    Land    700000.00    104";

public static void main(String[] args) throws FileNotFoundException {
    int count = 0;
    double totalCost = 0;

    BufferedReader reader = new BufferedReader(new StringReader(data));
    String line;

    try {
        while ((line = reader.readLine()) != null) {
            StringTokenizer stok = new StringTokenizer(line);
            int propertyId = Integer.parseInt(stok.nextToken());
            String type = stok.nextToken();
            double cost = Double.parseDouble(stok.nextToken());
            int agentId = Integer.parseInt(stok.nextToken());

            totalCost += cost;
            count++;
        }
        // close input stream
    }
    catch (Exception e) {
        e.printStackTrace();
    }
    finally {
        System.out.println("Total properties in list: " + count + "\nTotal cost is: " + totalCost);
    }
}
person Moritz Petersen    schedule 18.05.2012
comment
Хорошо, я попробую. Я думаю, пройдет минута, прежде чем я смогу заставить его работать достаточно. Я дам вам знать, если это сработает для меня. Спасибо! - person Random-Guy77; 18.05.2012
comment
упс, в моем ответе была ошибка. Сейчас исправил. - person Moritz Petersen; 18.05.2012
comment
Я пытаюсь понять, как использовать двойную общую стоимость в качестве буфера, но у меня возникли небольшие проблемы. Не могли бы вы помочь мне с этим? Я ценю ваше время. - person Random-Guy77; 18.05.2012
comment
Ах, буфер, вероятно, неправильный термин. Сразу после int count = 0; вставьте новую строку с double totalCost = 0.0; - person Moritz Petersen; 18.05.2012
comment
Я добавил предложенный код. Вывод предполагает, что программа проходит через цикл while только один раз. В конце count = 1 и totalCost = 0 в выводе консоли. - person Random-Guy77; 18.05.2012
comment
Большой вопрос: как разграничены ваши данные. Это точно вкладка? Это может быть причиной того, что он не работает. Другой вопрос: зачем вам DataInputStream? Это часть домашнего задания, может быть, вам следует использовать методы readInt(), readDouble()? - person Moritz Petersen; 18.05.2012
comment
Между каждым из наборов данных есть четыре пробела. - person Random-Guy77; 18.05.2012
comment
Хорошо, это ответ на мой первый вопрос. Я обновил свой ответ. Теперь ко второму вопросу ;-) - person Moritz Petersen; 18.05.2012
comment
Я должен использовать буферизованный FileReader. Я не знаю, могу ли я использовать для этого readInt() или readDouble(). Позвольте мне попробовать реализовать код. - person Random-Guy77; 18.05.2012
comment
Это получает данные, которые я ищу, однако он все еще проходит через цикл только один раз. Что-то не так с моим циклом while? - person Random-Guy77; 18.05.2012
comment
а) Что вы хотите этим сказать? Пожалуйста, обновите свой код, чтобы я мог видеть, что вы сделали. б) По крайней мере, одна проблема заключается в том, что вы неправильно обрабатываете исключение. Добавьте e.printStackTrace() в блок catch (Exception e) {} и посмотрите, что получится... - person Moritz Petersen; 18.05.2012
comment
Это дает мне исключение NumberFormatException: пустая строка в строке - totalCost =Double.parseDouble(line.split()[8]); -- Если я удалю e.printStackTrace(), ошибка исчезнет. - person Random-Guy77; 18.05.2012
comment
:-D нет, ошибка не исчезает; сообщение об ошибке просто не отображается. Вам нужно научиться отлаживать свой код... Итак, split() - неправильный подход. Используйте StringTokenizer. Я обновил свой ответ. - person Moritz Petersen; 18.05.2012
comment
После некоторой проверки форматирования я получил эту программу для работы. Спасибо большое за вашу помощь. Если бы в текстовом файле не было статического количества пробелов между наборами данных, как я мог решить эту проблему? - person Random-Guy77; 18.05.2012
comment
Отлично. Большое вам спасибо за вашу помощь. Теперь программа работает! - person Random-Guy77; 18.05.2012
comment
Вы должны точно знать структуру вашего ввода. Так, например, его можно было бы разграничить (тогда split() был бы хорошим выбором, как в случае с StringTokenizer, или лучше: выделенной библиотекой, такой как OpenCSV), либо он может быть проиндексирован, причем каждый набор будет находиться в одной и той же позиции. Тогда вы можете просто использовать line.subString(...). - person Moritz Petersen; 18.05.2012