将csv数据解析为Java中具有特定条件的对象

问题描述 投票:0回答:1

我是Java新手,正在尝试将csv文件解析为对象。我已经尝试过,但无法解决。

文件看起来像这样:

  [0],    [1], [2],    [3]  ,    [4]    ,   [5]   ,  [6] ,   [7]  ,  [8] , [9]
class, gender, age, bodyType, profession, pregnant, isYou ,species, isPet, role
scenario:green,   ,         ,           ,         ,        ,      ,      ,
person, female, 24, average ,           , FALSE   ,        ,      ,      , passenger
animal, male  ,  4,         ,           , FALSE   ,        , dog  , TRUE , pedestrian
scenario:red
person, male  , 16, athletic, boxer     , FALSE   ,  TRUE  ,      ,      , passenger
person, female, 25, athletic, doctor    , TRUE    ,  FALSE ,      ,      , pedestrian

我需要在任何情况下由任何数量的乘客和行人解析。最后,将这些方案添加到ArrayList中进行分析。

我认为是:

  1. 循环通过每条线,到达下一个scenario:red时停止,将乘客和行人添加到Character ArrayList。 (我已经添加完了,但是不知道如何停止)。
  2. 使用构造函数scenario创建scenario(ArrayList<Character> passenger, ArrayList<Character> pedestrians, boolean redOrGreen);
  3. ArrayList scenarios添加创建的方案。

我所做的是将所有内容放在一起而不是分开。非常感谢任何帮助或提示。

感谢这个为我提供帮助的社区,这是我到目前为止所获得的。

    public void loadCsv() throws IOException {

    String csvFile = "config.csv";
    String line = "";
    String csvSplit = "\\s*,\\s*";

    Scenario scenario = new Scenario();
    Person person = new Person();
    Animal animal = new Animal();

    ArrayList<Scenario> scenaios = new ArrayList<Scenario>();
    ArrayList<String> csvContents = new ArrayList<String>();

    ArrayList<Character> passengers = new ArrayList<Character>();
    ArrayList<Character> pedestrians = new ArrayList<Character>();

    try (BufferedReader csvReader = new BufferedReader(new FileReader(csvFile));) {
        String headerLine = csvReader.readLine(); //get rid of the header
        //add each line to the arrayList
        while ((line = csvReader.readLine()) != null) { 
            csvContents.add(line);   
        }

        for(String csvLine : csvContents) {                
            String[] data = csvLine.split(csvSplit); // split by comma and remove redundant spaces

            if (data.length == NO_OF_FIELD) { //check and avoid indexOutOfBoundException

                String clazz = data[0].toLowerCase();// cannot use word "class" as a variable

                if (clazz.startsWith("scenario") && data.length == 1) { 
                    scenario = new Scenario();
                    scenario.setLegalCrossing(clazz.endsWith("green"));
                    continue;
                } 

                else if ("person".equals(clazz) && data.length ==10) {

                    int age;
                    Gender genderEnum;
                    BodyType bodyTypeEnum;
                    Profession professionEnum;
                    boolean isPregnant;
                    boolean isYou;

                    try {
                        age = Integer.parseInt(data[2]);
                        genderEnum = Gender.valueOf(data[1].toUpperCase());
                        bodyTypeEnum = BodyType.valueOf(data[3].toUpperCase());
                        professionEnum = Profession.valueOf(data[4].toUpperCase());
                        isPregnant = Boolean.parseBoolean(data[5]);
                        isYou = Boolean.parseBoolean(data[6]);

                        person = new Person(age, professionEnum, genderEnum, bodyTypeEnum, isPregnant);
                        person.setAsYou(isYou);

                        String role = data[9].toLowerCase();
                        if ("passenger".equals(role)) {
                            if (null != person ) {
                                passengers.add(person);
                            }                        
                        }

                        else if ("pedestrian".equals(role)) {
                            if (null != person) {
                                pedestrians.add(person);
                            }
                        }
                    // dealing with empty profession
                    } catch (IllegalArgumentException e) {

                        age = Integer.parseInt(data[2]);
                        genderEnum = Gender.valueOf(data[1].toUpperCase());
                        bodyTypeEnum = BodyType.valueOf(data[3].toUpperCase());
                        professionEnum = Profession.UNKNOWN;
                        isPregnant = Boolean.parseBoolean(data[5]);
                        isYou = Boolean.parseBoolean(data[6]);

                        person = new Person(age, professionEnum, genderEnum, bodyTypeEnum, isPregnant);
                        person.setAsYou(isYou);

                        String role = data[9].toLowerCase();
                        if ("passenger".equals(role)) {
                            if (null != person ) {
                                passengers.add(person);
                            }
                        }

                        else if ("pedestrian".equals(role)) {
                            if (null != person) {
                                pedestrians.add(person);
                            }
                        }
                    }    
                } 

                else if ("animal".equals(clazz) && data.length ==10) {

                    int age; 
                    Gender genderEnum;
                    BodyType bodyTypeEnum;
                    String species;
                    boolean isPet;

                    try {
                        age = Integer.parseInt(data[2]);
                        genderEnum = Gender.valueOf(data[1].toUpperCase());
                        bodyTypeEnum = BodyType.valueOf(data[3].toUpperCase());
                        species = data[7];
                        isPet = Boolean.parseBoolean(data[8]);

                        animal = new Animal(age, genderEnum, bodyTypeEnum, species);
                        animal.setIsPet(isPet);

                        String role = data[9].toLowerCase();
                        if ("passenger".equals(role)) {
                            if (null != animal ) {
                                passengers.add(animal);
                            }
                        }                                           

                        else if ("pedestrian".equals(role)) {
                            if (null != animal) {
                                pedestrians.add(animal);
                            }
                        }                           
                    // dealing with empty bodyType
                    } catch (IllegalArgumentException e) {

                        age = Integer.parseInt(data[2]);
                        genderEnum = Gender.valueOf(data[1].toUpperCase());
                        bodyTypeEnum = BodyType.UNSPECIFIED;
                        species = data[7];
                        isPet = Boolean.parseBoolean(data[8]);

                        animal = new Animal(age, genderEnum, bodyTypeEnum, species);
                        animal.setIsPet(isPet);

                        String role = data[9].toLowerCase();
                        if ("passenger".equals(role)) {
                            if (null != animal ) {
                                passengers.add(animal);
                            }
                        }

                        else if ("pedestrian".equals(role)) {
                            if (null != animal) {
                                pedestrians.add(animal);
                            }
                        }
                    }                       
                }
            }


        }
        //passenger and pedestrians are in position
        System.out.println("passengers: " + passengers);
        System.out.println("pedestrians: " + pedestrians);

        if (null != scenario) {
            scenario.setPassengers(passengers);
            scenario.setPedestrians(pedestrians);
        }

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } 

}
java parsing
1个回答
0
投票

[如果可以更改csv文件格式,我将添加方案类型列(如果需要,还可以添加方案ID或名称),因此当您加入表(方案+乘客)时,您可以将csv文件作为数据库的结果集使用+行人),然后返回普通行。

使用这种方法,您将能够将解析委派到任何csv库,并分别进行逻辑处理(按方案ID /名称/类型分组)。

例如,您可以使用univocity简单地将文件解析为模型(甚至使用批注),然后将其迭代地分组和处理。

© www.soinside.com 2019 - 2024. All rights reserved.