繁体   English   中英

用java读取一个特殊的txt文件

[英]Reading a special txt file in java

我想要做的是读取一个包含人和动物的文本文件。 它将编译但在我尝试运行时出错。 我想我需要一个 for 循环来读取 stringtokenizer 来解密 txt 文件中的人类和动物,到目前为止这是我的驱动程序类。

txt文件:

Morely,Robert,123 Anywhere Street,15396,4,234.56,2
Bubba,Bulldog,58,4-15-2010,6-14-2011
Lucy,Bulldog,49,4-15-2010,6-14-2011
Wilder,John,457 Somewhere Road,78214,3,124.53,1
Ralph,Cat,12,01-16-2011,04-21-2012
Miller,John,639 Green Glenn Drive,96258,5,0.00,3
Major,Lab,105,07-10-2012,06-13-2013
King,Collie,58,06-14-2012,10-05-2012 
Pippy,cat,10,04-25-2015,04-25-2015
Jones,Sam,34 Franklin Apt B,47196,1,32.09,1
Gunther,Swiss Mountain Dog,125,10-10-2013,10-10-2013
Smith,Jack,935 Garrison Blvd,67125,4,364.00,4
Perry,Parrot,5,NA,3-13-2014
Jake,German Shepherd,86,11-14-2013,11-14-2013 
Sweetie,tabby cat,15,12-15-2013,2-15-2015
Pete,boa,8,NA,3-15-2015 

来源:

import java.util.Scanner;
import java.util.StringTokenizer;
import java.io.File;
import java.io.IOException;
/**
 * This is my driver class that reads from a txt file to put into an array and uses the class refrences so it can use the menu and spit out  
 * 
 * @author ******
 * @version 11/25/2015
 */
public class Driver
{
    /**
     * Constructor for objects of class Driver, what it does is read in the txt file gets the two class refrences and loops through to read through the whole file looking for string tokens to go to the next line
     * and closes the file at the end also uses for loop to count number of string tokens to decipher between human and pets.
     */
    public static void main(String[] args) throws IOException
    {
        Pet p;
        Human h;
        Scanner input;
        char menu;
        input = new Scanner(new File("clientdata.txt"));

        int nBalance;
        int id;

        /**
         * this while statement goes through each line looking for the string tokenizer ",". I want to count each "," to decipher between Human and Animal
         */
        while(input.hasNext())
        {
            StringTokenizer st = new StringTokenizer(input.nextLine(), ",");
            h = new Human();
            h.setLastName(st.nextToken());
            h.setFirstName(st.nextToken());
            h.setAddress(st.nextToken());
            h.setCiD(Integer.parseInt(st.nextToken()));
            h.setVisits(Integer.parseInt(st.nextToken()));
            h.setBalance(Double.parseDouble(st.nextToken()));
            p = new Pet(st.nextToken(), st.nextToken(), Integer.parseInt(st.nextToken()), st.nextToken(), st.nextToken());
        }
        /**
         * this is my seond while statement that loops the case switch statements and asks the user for client ID
         */
        menu = 'Y';
        while(menu == 'y' || menu == 'Y') {
            System.out.print("\nChose one:\n A- client names and outstanding balance \n B- client's pets, name, type and date of last visit\n C-change the client's outstanding balance: ");
            menu = input.next().charAt(0);
            System.out.print("Enter client ID: ");
            id = input.nextInt();
            h = new Human();
            if(id == h.getCiD())//if the id entered up top is equal to one of the id's in the txt file then it continues to the menu
            {
                p = new Pet();
             switch(menu)
       {    case 'A':
            System.out.println("client name: " + h.getFirstName() + "outstanding balance: " + h.getBalance());
             break;
             case 'B':
             System.out.println("pet's name: " + p.getName() + "type of pet: " + p.getTanimal() + "date of last visit: " + p.getLastVisit());
             break;
             case 'C':
             System.out.println("what do you want to change the clients balances to?");


        input.close();
       }
    }
    else// if not then it goes to this If statement saying that the Client does not exist
    { 
        System.out.println("Client does not exist.");
    }
   }
}
}

您有许多问题需要克服...

  • 对于每一行,您需要确定该行代表的数据类型
  • 您需要某种方式来跟踪您加载的数据(客户及其宠物)
  • 您需要某种方式将每只宠物与其主人联系起来

第一个可以通过多种方式完成,假设我们可以更改数据。 您可以使第一个标记有意义( humanpet ); 您可以改用 JSON 或 XML。 但让我们暂时假设,您无法更改格式。

这两种数据的主要区别在于它们包含的令牌数量,人为 7,宠物为 5。

while (input.hasNext()) {
    String text = input.nextLine();
    String[] parts = text.split(",");
    if (parts.length == 7) {
        // Parse owner
    } else if (parts.length == 5) {
        // Parse pet
    } // else invalid data

对于第二个问题,您可以使用数组,但您需要提前知道您需要的元素数量、人数以及每个人的宠物数量

奇怪的是,我刚刚注意到最后一个元素是一个int并且似乎代表了宠物的数量!!

Morely,Robert,123 Anywhere Street,15396,4,234.56,2
                                     ------------^

但这对我们的业主没有帮助。

对于所有者,您可以使用某种List ,每当您创建一个新的Human ,您只需将它们添加到List ,例如...

List<Human> humans = new ArrayList<>(25);
//...
    if (parts.length == 7) {
        // Parse the properties
        human = new Human(...);
        humans.add(human);
    } else if (parts.length == 5) {

第三,对于宠物,每个Pet都应该与主人直接相关,例如:

Human human = null;
while (input.hasNext()) {
    String text = input.nextLine();
    String[] parts = text.split(",");
    if (parts.length == 7) {
        //...
    } else if (parts.length == 5) {
        if (human != null) {
            // Parse pet properties
            Pet pet = new Pet(name, type, age, date1, date2);
            human.add(pet);
        } else {
            throw new NullPointerException("Found pet without human");
        }
    }

好的,所有这些都是每次我们创建一个Human ,我们都会保留对创建的“当前”或“最后一个”所有者的引用。 对于我们解析的每个“宠物”行,我们将其添加到所有者。

现在, Human类可以使用数组或List来管理宠物,两者都可以,因为我们知道宠物的预期数量。 然后,您将在Human类中提供 getter 以获取对 pet 的引用。

因为上下文之外的代码可能难以阅读,这是您可能能够执行的操作的示例...

Scanner input = new Scanner(new File("data.txt"));
List<Human> humans = new ArrayList<>(25);
Human human = null;
while (input.hasNext()) {
    String text = input.nextLine();
    String[] parts = text.split(",");
    if (parts.length == 7) {
        String firstName = parts[0];
        String lastName = parts[1];
        String address = parts[2];
        int cid = Integer.parseInt(parts[3]);
        int vists = Integer.parseInt(parts[4]);
        double balance = Double.parseDouble(parts[5]);
        int other = Integer.parseInt(parts[6]);
        human = new Human(firstName, lastName, address, cid, vists, balance, other);
        humans.add(human);
    } else if (parts.length == 5) {
        if (human != null) {
            String name = parts[0];
            String type = parts[1];
            int age = Integer.parseInt(parts[2]);
            String date1 = parts[3];
            String date2 = parts[4];
            Pet pet = new Pet(name, type, age, date1, date2);
            human.add(pet);
        } else {
            throw new NullPointerException("Found pet without human");
        }
    }
}

使用split()函数而不是使用StringTokenizer怎么样?

说,你可以改变你的第一个while循环,如下所示:

while (input.hasNext()) {
//  StringTokenizer st = new StringTokenizer(input.nextLine(), ",");
    String[] tokens = input.nextLine().split(",");
    if (tokens.length == 7) {
        h = new Human();
        h.setLastName(tokens[0]);
        h.setFirstName(tokens[1]);
        h.setAddress(tokens[2]);
        h.setCiD(Integer.parseInt(tokens[3]));
        h.setVisits(Integer.parseInt(tokens[4]));
        h.setBalance(Double.parseDouble(tokens[5]));
    } else {
        p = new Pet(tokens[0], tokens[1], Integer.parseInt(tokens[2]), tokens[3], tokens[4]);
    }
}

而对于跟踪哪些宠物属于哪个人的,可以追加型的ArrayList PetHuman的类象下面这样:

ArrayList<Pet> pets = new ArrayList<>();

说你有另一个ArrayList类型的Human命名为humans的主要功能。 因此,您可以添加if块,例如:

humans.add(h);

else部分,您可以附加到else块中:

humans.get(humans.size()-1).pets.add(p);

您可以尝试这样的操作 - 填充地图,然后使用它您可以根据您的要求分配值。

public void differentiate(){
    try {
        Scanner scan=new Scanner(new BufferedReader(new FileReader("//your filepath")));
            Map<String,List<String>> map=new HashMap<String, List<String>>();
            while(scan.hasNextLine()){
            List<String> petList=new ArrayList<String>();
            String s=scan.nextLine();
            String str[]=s.split(",");
            String name=str[1]+" "+str[0];
            int petCount=Integer.parseInt(str[str.length-1]);
                for(int i=1;i<=petCount;i++){
                 String petString=scan.nextLine();
                 petList.add(petString);
                }
                map.put(name, petList);
            }
            Set<String> set=map.keySet();
            for(String str:set){
                System.out.println(str+" has "+map.get(str)+" pets");
            }
        } 
        catch (FileNotFoundException e) {
        System.out.println(e.getMessage());
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM