java - 如何创建动态对象列表

标签 java object string-parsing opencsv

假设我有一个 CSV 文件:

employees.csv

ID,Name,Role,Salary
1,Pankaj Kumar,CEO,"5,000USD"
2,Lisa,Manager,500USD
3,David,,1000USD

我可以将其解析为 Employee 对象列表:

Employee.java

package com.journaldev.parser.csv;

public class Employee {

    private String id;
    private String name;
    private String role;
    private String salary;

    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getRole() {
        return role;
    }
    public void setRole(String role) {
        this.role = role;
    }
    public String getSalary() {
        return salary;
    }
    public void setSalary(String salary) {
        this.salary = salary;
    }

    @Override
    public String toString(){
        return "ID="+id+",Name="+name+",Role="+role+",Salary="+salary+"\n";
    }
}

但是,如果我想让我的代码能够处理具有更多或更少列的文件,而无需事先知道它们的名称是什么:

employees.csv

ID,Name,Role,Salary, dateJoined, sex
1,Pankaj Kumar,CEO,"5,000USD",Jan 05 2014 12:04:01PM,MALE
2,Lisa,Manager,500USD,Feb 11 2012 12:04:01PM, FEMALE
3,David,,1000USD,Jan 02 2013 12:04:01PM, MALE

我想这样做,以便文件中的列数无关紧要。 因此,对于文件中的每一列,代码都会在对象列表中创建另一个元素。

我的其余代码:

package openCSV_fileReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;
public class OpenCSV_fileReader {

     public static void main(String[] args) throws IOException {

            List<Employee> emps = parseCSVFileAsList();
            System.out.println("**********");
            writeCSVData(emps);
     }
        private static void writeCSVData(List<Employee> emps) throws IOException {
            StringWriter writer = new StringWriter();
            CSVWriter csvWriter = new CSVWriter(writer,'#');
            List<String[]> data  = toStringArray(emps);
            csvWriter.writeAll(data);
            csvWriter.close();
            System.out.println(writer);
        }

        private static List<String[]> toStringArray(List<Employee> emps) {
            List<String[]> records = new ArrayList<String[]>();
            //add header record
            records.add(new String[]{"ID","Name","Role","Salary"});
            Iterator<Employee> it = emps.iterator();
            while(it.hasNext()){
                Employee emp = it.next();
                records.add(new String[]{emp.getId(),emp.getName(),emp.getRole(),emp.getSalary()});
            }
            return records;
        }

        private static List<Employee> parseCSVFileAsList() throws IOException {
            CSVReader reader = new CSVReader(new FileReader("employees.csv"), ',');

            List<Employee> emps = new ArrayList<Employee>();
            //read all lines at once
            List<String[]> records = reader.readAll();

            Iterator<String[]> iterator = records.iterator();
            //skip header row
            iterator.next();

            while(iterator.hasNext()){
                String[] record = iterator.next();
                Employee emp = new Employee();
                emp.setId(record[0]);
                emp.setName(record[1]);
                emp.setRole(record[2]);
                emp.setSalary(record[3]);
                emps.add(emp);
            }

            reader.close();

            System.out.println(emps);
            return emps;
        }     
}

这可行吗? 这就是我无法找到实现此目的的方法的地方。

最佳答案

public class CSVTable {

    private String[][] csvTable = null;

    public CSVTable(int columns)
    {
        csvTable = new String[columns][2];
    }

    public String[][] getCSVTable()
    {
        return this.csvTable;
    }

    public void setCSVTable(String[][] csvTable)
    {
        this.csvTable = csvTable;
    }
}
<小时/>
private static List<Employee> parseCSVFileAsList() throws IOException {
            CSVReader reader = new CSVReader(new FileReader("employees.csv"), ',');

        List<CSVTable> csvObjects = new ArrayList<CSVTable>();
        //read all lines at once
        List<String[]> records = reader.readAll();
        String[] columns = null;
        String[] record = null;
        int length = 0;
        Iterator<String[]> iterator = records.iterator();
        //skip header row

        record = iterator.next();
        length = record.length;
        columns = new String[length];
        for(int i = 0; i < length; i++)
        {
            columns[i] = record[i];
        }


        while(iterator.hasNext()){
            record = iterator.next();
            CSVTable csvTable = new CSVTable(record.length);
            String[][] insertRecord = csvTable.getCSVTable();
            for(int i = 0; i < length; i++)
            {
                insertRecord[i][0] = columns[i];
                insertRecord[i][1] = record[i];
            }
            csvTable.setCSVTable(insertRecord);
            csvObjects.add(csvTable);
        }

        reader.close();

        System.out.println(csvObjects);
        return csvObjects;
    }

我希望这足以说明您还必须修改其他一些方法。

关于java - 如何创建动态对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25789250/

相关文章:

java.lang.object无法转换为(自制类)

Javascript从动态名称访问嵌套对象

c++ - string::std find 方法总能找到一个字符,即使它不在字符串中

regex - 当子字符串在 R 中多次出现时删除子字符串之间的字符串部分

java - Android有效地从输入流中读取

java - 如何在Windows中最好地设置java的路径

java - 将 ORACLE 数据类型映射到 JAVA 数据类型

java - 从日期列表中获取最接近特定日期的日期?

Java:对象数组列表

algorithm - 多遍解析字符串的编程习惯用法