如何存储以逗号分隔的.txt文件中的数据,而忽略逗号后面的空白区域

时间:2019-02-09 21:14:56

标签: java split

我有两个问题。

  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

  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 :(得分:2)

使用正则表达式

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

答案 1 :(得分:1)

基本上,您想为所有类型的元素创建单独的列表。我将使用以下方法为程序中的所有数据类型创建单独的列表:

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);

这是isIntegerisDouble函数的定义

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;
   }
}

替代方法

如果您可以使用Scanner类进行阅读,那么使用hasNextIntnextInt方法甚至会是一个简单的问题。

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

要拆分,您可以按照其他答案中的建议使用str.split(", ?")

答案 2 :(得分:1)

对于第一部分,我决定简单地删除空白,然后使用“,”进行解析。但是还提出了其他好的方法,这些方法也很好。

要从字符串中分离浮点数,请检查每个数据条目,并检查其是否包含浮点分隔符(“。”)。如果是这样,请检查它是否为浮点并将其添加到数字列表中。请注意,numbersListArrayList<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);
    }