Сохранение данных из текста в переменные

#java #text-files

#java #текстовые файлы

Вопрос:

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

a 1000 1
b 2000 2
c 3000 3

Теперь я пытаюсь сохранить символы в отдельные переменные, а целые числа — в отдельные переменные.

Моя попытка до сих пор заключалась в том, что я считывал текстовый файл в строку, а затем использовал string tokenizer для сохранения каждого элемента в списке массива. У меня вроде как есть общее представление о том, как это сделать; проверьте, является ли элемент в списке символом, если да, сохраните его в символьной переменной или, если это целое число, сохраните его в int. Однако я не знаком с методами определения того, является ли что-либо строкой или целым числом, такими как isString, isInteger и т.д. И т.п. Кто-нибудь, пожалуйста, может дать мне несколько советов о том, как это сделать?

Мой код выглядит следующим образом:

 public class copyToString {


    public static void main(String[] args) {

        String fileSpecified = args[0];

        fileSpecified = fileSpecified.concat(".txt");
        char [] content = new char[1024];

        System.out.println ("file Specified = "   fileSpecified);

        String container;
        ArrayList <String> words = new ArrayList<String> ();


        try {
            FileReader fr = new FileReader (fileSpecified);
            BufferedReader br = new BufferedReader (fr);
            StringBuilder builder = new StringBuilder();

            int read = 0;
            while ((read = br.read(content, 0, content.length)) > 0) {
                builder.append(content, 0, read);
            }

            container = builder.toString();

            StringTokenizer tokenizer = new StringTokenizer (container);
            while (tokenizer.hasMoreTokens()) {
                words.add(tokenizer.nextToken());
            }
            fr.close();
        } catch (IOException e) {
            System.out.println (e.getMessage());
        }

        for (int i = 0; i < words.size(); i  ) {
            System.out.println ("words = "   words.get(i));


        }



    }



}
  

Спасибо

Комментарии:

1. вы могли бы использовать Scanner — это действительно проще, чем StringTokenizer. Одна вещь не ясна. Вы говорите, что формат входного файла известен, и даете пример, так почему вы хотите программно распознать тип переменной?

2. Спасибо Лукашу, сканер на самом деле проще, это также сэкономит мне время. Приведенный мною формат входного файла — это всего лишь один пример из многих, которые нам предоставили для выполнения задачи. Я должен рассматривать символы и целые числа отдельно, поскольку я буду иметь дело с ними по-разному. Является ли этот ответ тем, что вы, возможно, ожидали?

Ответ №1:

Я бы очень рекомендовал здесь библиотеку Apache Commons. Поскольку эта библиотека имеет

  • Класс StringUtils, который имеет большую базу методов для проверки содержимого строки
  • Класс IOUtils для удобного чтения файлов

Кроме того, я бы использовал простые группы регулярных выражений для идентификации ваших текстовых частей.

Подробности см. в разделе Шаблон и класс сопоставления. (Регулярное выражение для слов: » w», цифры «d»)

Ответ №2:

Если вы действительно не знаете, каким может быть каждый тип, вам нужно хранить каждое поле в виде строки, поскольку число типа 1000 может быть short, int, long, float, double или String. Является 1 числом, строкой или символом ‘1’? Без контекста вы не можете знать, что такое каждый тип. a , b и c могут быть числами в шестнадцатеричном формате. 😉


Мне потребовалось бы больше времени, чтобы сказать, что я бы сделал по-другому, чем переписывать код. 😉

 public class CopyToString {
    static class Line {
        String word;
        int num1, num2;

        Line(String word, int num1, int num2) {
            this.word = word;
            this.num1 = num1;
            this.num2 = num2;
        }

        @Override
        public String toString() {
            return "Line{"   "word='"   word   '''   ", num1="   num1   ", num2="   num2   '}';
        }
    }

    public static void main(String... args) throws IOException {
        String fileSpecified = args[0]   ".txt";
        System.out.println("file Specified = "   fileSpecified);
        BufferedReader br = new BufferedReader(new FileReader(fileSpecified));

        List<Line> lines = new ArrayList<Line>();
        for (String line; (line = br.readLine()) != null;) {
            Scanner scanner = new Scanner(line);
            lines.add(new Line(scanner.next(), scanner.nextInt(), scanner.nextInt()));
        }
        br.close();

        for (Line l : lines)
            System.out.println(l);
    }
}
  

С принтами

 file Specified = text.txt
Line{word='a', num1=1000, num2=1}
Line{word='b', num1=2000, num2=2}
Line{word='c', num1=3000, num2=3}
  

Комментарии:

1. Спасибо. Если, скажем, текстовый файл содержал данные неизвестной длины (учитывая, что объем данных в текстовом файле может варьироваться), нам пришлось бы объявить довольно много переменных. Теперь, чтобы избежать этого, возможно ли объявить массив char умеренного размера, а затем сохранить символы в нем и массив int и сделать то же самое?

2. Если вы можете предположить, что у вас есть только char или int, вы можете использовать обычный int[] (поскольку char помещается внутри int), В этом случае я бы использовал split и parseInt . Как вы будете определять различия между числом 1 и символом ‘1’

3. Предоставленные нами текстовые файлы всегда будут в том же формате, который я показал. В этом случае каждая строка должна начинаться с алфавита (char), а затем иметь значение int (например, 1000) и значение без знака int (например, 1). В таком случае, действительно ли мне нужно беспокоиться о различии между числом 1 и символом ‘1’?