如何在java应用程序中解析文本文件中的int或double值

时间:2016-10-25 09:21:45

标签: java networking

我想将特定值从文本文件复制到Java Application中的Arraylist。这是我的文本文件(作为test.text存储在我的桌面中)

String name = carrot;
double unit_price = 200;
int unit = 10;

这个值我想存储在Arraylist中,它存在于我的主应用程序中,如下所示:

package com.main;
import com.collection.Ingridient;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class FileReaderApp {


    public static void main(String[] args) throws FileNotFoundException, IOException {
        Ingridient i_one = new Ingridient();
        ArrayList<Ingridient> db = new ArrayList<Ingridient>();
        FileReader fin = new FileReader("/home/yati/Desktop/test");
        Scanner src = new Scanner(fin);
// Read the ingridient from text file.
        while (src.hasNext()) {
            if (src.hasNext()) {
                i_one.setName(src.next());
                System.out.println("Name: " +src.next());
            } else
                if(src.hasNextDouble()) {
              i_one.setUnit_price(src.nextDouble());
              System.out.println("Unit Price: " +src.nextDouble());
            }
                else if (src.hasNextInt()) {
                  i_one.setUnit(src.nextInt());
                  System.out.println("Unit: " +src.nextInt());
                } else {
                    System.out.println("File format error.");
                    return;
                }
            db.add(i_one);
        }
        fin.close();

    }

}

她,Ingridient类有以下代码:

package com.collection;
public class Ingridient {
    String name;
    Double unit_price;
    int unit;

    public Ingridient() {
        name = null;
        unit_price = null;
        unit = 0;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setUnit_price(Double unit_price) {
        this.unit_price = unit_price;
    }

    public void setUnit(int unit) {
        this.unit = unit;
    }    

}

我的问题是我的应用程序只能在Ingridient对象中存储名称,并且它不能在unit和unit_price中存储任何值。获得的输出是: enter image description here 我知道我在某个地方有误,但我无法解决这个问题。有什么建议吗?

6 个答案:

答案 0 :(得分:1)

这应该这样做:

public static void main(String[] args) throws IOException {
    String content = "String name = carrot;\ndouble unit_price = 200;\nint unit = 10;";
    try (Scanner sc = new Scanner(content)) {
        sc.useDelimiter("(;*\n*.+ .+ = )|;");
        List<Incredient> incredients = new ArrayList<>();
        while (true) {
            Incrediend incredient = new Incredient();
            if (sc.hasNext()) {
                String name = sc.next();
                incredient.setName(name);
                System.out.println("Name: " + name);
            } else {
                break;
            }
            if (sc.hasNextDouble()) {
                double unitPrice = sc.nextDouble();
                incredient.setUnit_price(unitPrice);
                System.out.println("Unit Price: " + unitPrice);
            } else {
                break;
            }
            if (sc.hasNextInt()) {
                int unit = sc.nextInt();
                incredient.setUnit(unit);
                System.out.println("Unit: " + unit);
            } else {
                break;
            }
            incredients.add(incredient);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是因为我使用了(;*\n*.+ .+ = )|;的分隔符。 这个正则表达式只会删除您不想保存的文本文件的所有部分。

您的方法存在一些问题,例如:

i_one.setName(src.next());
System.out.println("Name: " +src.next());

在这里,您从扫描仪中读取2个令牌,因为有next()的2次调用,如果您想为多个事项使用相同的令牌,则应创建一个新变量来存储它(例如:String name = sc.next())。

Scanner使用的默认分隔符是单个空格,因此,在您的代码中,hasNextDouble()hasNextInt()将永远不会为真,文本中的所有数字文件以;结尾。

我不确定你在这里尝试做什么,从文本文件解析java代码有点不寻常。如果您可以更改文本文件的格式,则应选择一个更易于解析的格式(例如CSV)。

答案 1 :(得分:0)

src.hasNext()选择您文件中的每一行,因此它永远不会跳转到if / else条件之一 我还建议使用json作为输入格式;)

答案 2 :(得分:0)

{{1}}

它始终是真的,而另一个其他{}部分则无法使用

答案 3 :(得分:0)

你的第一个if条件是错误的,以获得你需要的输出......

  

if(src.hasNext())

如果条件永远不会执行,则此条件将始终满足,因为将存在下一个对象和您的后续其他对象。这可以在输出中看到始终在第一个if条件下从 sysout 打印数据。

我已将代码更改为使用字符串类给出的 startsWith 方法。希望它有所帮助...

  

注意:在解析之前请确保删除这些特殊字符(如果有)。 (半殖民地等)

while (src.hasNext()) {
            String input = src.next();
            if (input.startsWith("name")) {
                i_one.setName(input);
                System.out.println("Name: " + input);
            } else if (input.startsWith("unit_price")) {
                i_one.setUnit_price(Double.parseDouble(input));
                System.out.println("Unit Price: " + input);
            } else if (input.startsWith("unit")) {
                i_one.setUnit(Integer.parseInt(input));
                System.out.println("Unit : " + input);
            } else {
                System.out.println("File format error.");
                return;
            }
            db.add(i_one);
}

答案 4 :(得分:0)

文本文件的结构不太适合解析所需的值。

如果你能够将它改为

carrot,200,10
因此,在一行中具有所需成分的所有值。将此行拆分为“,”将为您提供实例化对象所需的所有值。

如果您无法更改文本格式(因为它是任务的一部分),您应该阅读文本文件的整行并解释它们的三元组以获取对象。所以你也可以确定你需要的所有值都在那里。

答案 5 :(得分:0)

如果文本文件的结构始终相同,则可以使用字符串类的contains方法。例如:

    public class FileReaderApp {
        public static void main(String[] args) throws FileNotFoundException, IOException {
            Ingridient i_one = new Ingridient();
            ArrayList<Ingridient> db = new ArrayList<Ingridient>();

            try(BufferedReader br = new BufferedReader(new FileReader("/home/yati/Desktop/test.txt"))) {         
                String line ;
                while ((line = br.readLine())!=null) {
                    String [] splited;
                  if(line.contains("String name")){
                      splited= line.split(" ");
                      i_one.setName(splited[splited.length-1].replace(";", ""));
                      System.out.println(i_one.name);
                  }
                  else if(line.contains("double unit_price")){
                      splited= line.split(" ");
                      i_one.setUnit_price(Double.parseDouble(splited[splited.length-1].replace(";", "")));
                      System.out.println(i_one.unit_price);
                  }
                  else if(line.contains("int unit")){
                      splited= line.split(" ");
                      i_one.setUnit(Integer.parseInt(splited[splited.length-1].replace(";", "")));
                      System.out.println(i_one.unit);
                  }
                }            
            }
            db.add(i_one);
        }    
    }