Как хранить данные из файлов .txt, разделенных запятыми, игнорируя пустое пространство за запятыми - PullRequest
0 голосов
/ 10 февраля 2019

У меня две проблемы.

  1. Итак, файл .txt выглядит так:

1, 2, 2.0, car, 3, 4,20, house, 7, 8.2, 19, movie, 3,1, 45

Мне нужно разделить ихчисла и слова и помещают их в отдельные списки, но это работает только тогда, когда я использую метод .split(", ");, и это не помещает числа, у которых нет запятых в запятых, в мой список номеров.Мой код:

File file = new File(pathToFile); 

    br = new BufferedReader(new FileReader(file));

    String str; 
    while ((str = br.readLine()) != null) {

        data = str.split(", ");
    }

for (String entry : data) {
    try {
            int number = Integer.valueOf(entry);
            numbersList.add(number);
        } catch (NumberFormatException e) {

            wordsList.add(entry);
        }
    }

System.out.println(numbersList);
System.out.println(wordsList);

Я где-то читал, что метод .split(); автоматически игнорирует пустые пробелы, но, похоже, это не так, потому что я получаю такой вывод:

numbersList - 1, 2, 3, 7, 19, 45

wordsList - 2.0, car, 4,20, house, 8.2, movie, 3,1

Мне нужна помощь в отделении поплавков от слов.До сих пор я пробовал это:

try {
    int number = Integer.valueOf(entry);
    float decimalNumber = Float.parseFloat(entry);
    numbersList.add(number);
    decimalNumbersList.add(decimalNumber);
} catch (NumberFormatException e) {

    wordsList.add(entry);
}

Но это не сработало.Совсем.Он просто преобразовал нормальные числа в числа с плавающей точкой.

decimalNumbersList - 1.0, 2.0, 24.0, 18.0, 1.0, 3.0, 20.0, 12.0, 8.0, 12.0

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019

Похоже, в основном вы хотите создать отдельный список для всех типов элементов.Я бы использовал следующий подход для создания отдельного списка для всех типов данных в вашей программе:

for (String entry : data) {
  if(isInteger(entry))
    numbersList.add(Integer.valueOf(entry));
  else if(isDouble(entry))
    doublesList.add(Double.valueOf(entry));
  else
    wordsList.add(entry);
}

System.out.println(numbersList);
System.out.println(wordsList);
System.out.println(doublesList);

Вот определение isInteger и isDouble function

boolean isInteger(String input){
   try {
       Integer.parseInt(input);
       return true;
   } catch (NumberFormatException e) {
    return false;
   }
}

boolean isDouble(String input){
   try {
       Double.parseDouble(input);
       return true;
   } catch (NumberFormatException e) {
    return false;
   }
}

AlternateПодход

Если вы можете читать с использованием класса Scanner, то было бы даже просто решить проблему с использованием hasNextInt и nextInt метода.

if (scanner.hasNextInt())
  numbersList.add(scanner.nextInt());
else if (scanner.hasNextDouble())
  doublesList.add(scanner.nextDouble());
else
  wordsList.add(scanner.next());

Для разбиения вы можетеиспользуйте str.split(", ?"), как предложено в другом ответе.

0 голосов
/ 10 февраля 2019

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

Чтобы отделить число с плавающей запятой от строк, я просматриваю каждую запись данных и проверяю, содержит ли она символ разделителя с плавающей запятой (".").Если это так, проверьте, что это поплавок и добавьте его в список номеров.Обратите внимание, numbersList является ArrayList<Number>.

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

        File file = new File("path");

        BufferedReader br = new BufferedReader(new FileReader(file));

        String str;
        String[] data = null;
        ArrayList<Number> numbersList = new ArrayList<>();
        ArrayList<String> wordsList = new ArrayList<>();

        //Remove white space and split by comma
        while ((str = br.readLine()) != null) {
            str = str.replaceAll(" ", "");
            data = str.split(",");
        }

        assert data != null;
        for (String entry : data) {

            //check for floats
            if(entry.contains(".")){
                try {
                    //Check if we can parse 
                    float d = Float.parseFloat(entry);
                    //Add to numbers list.
                    numbersList.add(d);
                } catch (NumberFormatException e) {
                    e.printStackTrace();
                }
            //Else, handle the rest
            } else {
                try {
                    int number = Integer.valueOf(entry);
                    numbersList.add(number);
                } catch (NumberFormatException e) {
                    wordsList.add(entry);
                }
            }
        }
        System.out.println(numbersList);
        System.out.println(wordsList);
    }
0 голосов
/ 10 февраля 2019

Использование Regex

data = str.split(", ?");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...