从文件中读取并分割线

时间:2014-09-13 15:30:04

标签: java string file file-io bufferedreader

这里我书店最后一部分的说明是:

  

通过Bookstore类的read()方法,可以阅读有关发布者和书籍的信息,并将其存储在相应的集合中。此方法接收文件路径作为参数。该文件是按字段排列的文本,由字段分隔,&#39 ;;'。   每行包含有关出版商或图书的信息,如果第一个字段包含字母" P"或" B"分别。   发布商行在第一个后面包含字段名称,平均递送和电子邮件。   在第一个之后,书籍行包含字段标题,作者,年份,价格,出版商名称和数量。   该方法必须忽略不符合此描述模式的行。 <

这里是我创建的代码:

public void read(String dir) throws IOException, FileNotFoundException {
    String s;
    String name="", del="", email="";
    int delivery=0;
    String author="", title="", publisher="", yr="", qnt="", prc="";
    int year=0, quantity=0;
    double price=0.0;
    int ch = 0;
    BufferedReader br = new BufferedReader(new FileReader(dir));

    while((s=br.readLine())!=null){

        // Here I know I should put more conditions but I can't define in my mind "field" in a right way.

        if((s.charAt(0)!='P' && s.charAt(1)!=';') || (s.charAt(0)!='B' && s.charAt(1)!=';'))
            System.out.println("Line not conform");

        else if((s.charAt(0)=='P') && (s.charAt(1)==';')){
            for(int i=2; s.charAt(i)!=';'; i++){
                name += s.charAt(i);
                ch = i+2;
            }
            for(int i=ch; s.charAt(i)!=';'; i++){
                del += s.charAt(i);
                delivery = Integer.parseInt(del);
                ch = i+2;
            }
            for(int i=ch; i<s.length(); i++){
                email += s.charAt(i);
            }
            publishers.add(new Publisher(name, delivery, email));
            name=""; del=""; email="";
            ch=0; delivery=0;

        } else if((s.charAt(0)=='B') && (s.charAt(1)==';')){
            for(int i=2; s.charAt(i)!=';'; i++){
                title += s.charAt(i);
                ch = i+2;
            }
            for(int i=ch; s.charAt(i)!=';'; i++){
                author += s.charAt(i);
                ch = i+2;
            }
            for(int i=ch; s.charAt(i)!=';'; i++){
                yr += s.charAt(i);
                year = Integer.parseInt(yr);
                ch = i+2;
            }
            for(int i=ch; s.charAt(i)!=';'; i++){
                prc += s.charAt(i);
                price = Double.parseDouble(prc);
                ch = i+2;
            }
            for(int i=ch; s.charAt(i)!=';'; i++){
                publisher += s.charAt(i);
                ch = i+2;
            }
            for(int i=ch; i<s.length(); i++){
                qnt += s.charAt(i);
                quantity = Integer.parseInt(qnt);
            }

            Book book=null;
            for(int i=0; i<publishers.size(); i++){
                if(publisher.equals(publishers.get(i).getName())){
                    book = new Book(title, author, year, price, publisher);
                    books.add(book);
                }
            }
            libro.setQuantity(quantity);
            author=""; title=""; publisher=""; prc=""; yr=""; qnt="";
            ch=0; year=0; price=0; quantity=0;
        }
    }
}

就我而言,我可以正确存储出版商和书籍,但后来我没有通过最后一次测试,因为我不知道如何用正确的代码表达字段的概念。 有人可以帮帮我吗?

此外,我确信有一种更简单的方法可以写出我写的内容,但在我看来这是目前最好的解决方案。

更新

感谢Aeshang,我能够修改和更正我的代码,现在一切正常! 还有一件事:如果有办法可以帮助我简化它吗?

public void leggi(String dir) throws IOException, FileNotFoundException {
    String s;
    String name="", del="", email="";
    int delivery=0;
    String author="", title="", publisher="", yr="", qnt="", prc="";
    int year=0, quantity=0;
    double price=0.0;
    BufferedReader br = new BufferedReader(new FileReader(dir));

    while((s=br.readLine())!=null){
        boolean isOk=true;
        String[] splitted = s.split(";");

        if((splitted.length!=7 && splitted.length!=4) || (!splitted[0].equals("E") && !splitted[0].equals("L")))
            System.out.println("Line not conform");
        else if(splitted[0].equals("E")){

            name=splitted[1];

            if(splitted[2].startsWith("0")||splitted[2].startsWith("1")||splitted[2].startsWith("2")||
                    splitted[2].startsWith("3")||splitted[2].startsWith("4")||splitted[2].startsWith("5")||
                    splitted[2].startsWith("6")||splitted[2].startsWith("7")||splitted[2].startsWith("8")||
                    splitted[2].startsWith("9")){
                del=splitted[2];
                delivery=Integer.parseInt(del);
            } else isOk=false;

            email=splitted[3];

            if(isOk==true){
                publishers.add(new Publisher(name, delivery, email));
                name=""; del=""; email=""; delivery=0;
            } else System.out.println("Line not conform");

        } else if(splitted[0].equals("L")){

            title=splitted[1];

            author=splitted[2];

            if(splitted[3].startsWith("0")||splitted[3].startsWith("1")||splitted[3].startsWith("2")||
                    splitted[3].startsWith("3")||splitted[3].startsWith("4")||splitted[3].startsWith("5")||
                    splitted[3].startsWith("6")||splitted[3].startsWith("7")||splitted[3].startsWith("8")||
                    splitted[3].startsWith("9")){
                yr=splitted[3];
                year=Integer.parseInt(yr);
            } else isOk=false;

            if(splitted[4].startsWith("0")||splitted[4].startsWith("1")||splitted[4].startsWith("2")||
                    splitted[4].startsWith("3")||splitted[4].startsWith("4")||splitted[4].startsWith("5")||
                    splitted[4].startsWith("6")||splitted[4].startsWith("7")||splitted[4].startsWith("8")||
                    splitted[4].startsWith("9")){
                prc=splitted[4];
                price=Double.parseDouble(prc);
            } else isOk=false;

            publisher=splitted[5];

            if(splitted[6].startsWith("0")||splitted[6].startsWith("1")||splitted[6].startsWith("2")||
                    splitted[6].startsWith("3")||splitted[6].startsWith("4")||splitted[6].startsWith("5")||
                    splitted[6].startsWith("6")||splitted[6].startsWith("7")||splitted[6].startsWith("8")||
                    splitted[6].startsWith("9")){
                qnt=splitted[6];
                quantityt=Integer.parseInt(qnt);
            } else isOk=false;

            if(isOk==true){
                Book book=null;
                book = new Book(title, author, year, price, publisher);
                books.add(book);
                book.setQuantity(quantity);
                author=""; title=""; publisher=""; prc=""; yr=""; qnt="";
                year=0; price=0; quantity=0;
            } else System.out.println("Line not conform");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

你听说过拆弦吗?请使用以下语法

String[] splitedString = s.split(";");

然后循环中的代码可以像这样改变

String[] splitedString = s.split(";");
if(splitedString[0].length==1 && !(splitedString[0].equalsIgnoreCase("p") || splitedString[0].equalsIgnoreCase("b"))) {
        System.out.println("Line not conform");
} else if(splitedString[0].equalsIgnoreCase(p) && splitedString.length==5) {
            name = splitedString[1];
            average = splitedString[2];
            delivery = splitedString[3];
            email = splitedString[4];
        }

依旧......

编辑:

对于所有你解析int&amp;解析双请改变它们。保持简单,删除所有代码,包括if检查,它们应该像

一样简单
try {
    delivery=Integer.parseInt(splitted[2].trim());
} catch (NumberFormatException) {
    isOk=false;
}