Java 如何创建对象的动态列表
假设我有一个CSV文件,如下所示:Java 如何创建对象的动态列表,java,object,string-parsing,opencsv,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;
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;
}
}
包openCSV\u文件阅读器;
导入java.io.FileReader;
导入java.io.IOException;
导入java.io.StringWriter;
导入java.util.ArrayList;
导入java.util.Iterator;
导入java.util.List;
导入au.com.bytecode.opencsv.CSVReader;
导入au.com.bytecode.opencsv.CSVWriter;
公共类OpenCSV_文件读取器{
公共静态void main(字符串[]args)引发IOException{
List emps=parseCSVFileAsList();
System.out.println(“**********”);
写入数据(emps);
}
私有静态void writeCSVData(列表emps)引发IOException{
StringWriter编写器=新的StringWriter();
CSVWriter CSVWriter=新的CSVWriter(编写器“#”);
列表数据=toStringArray(emps);
csvWriter.writeAll(数据);
csvWriter.close();
System.out.println(writer);
}
至Tringarray的专用静态列表(列表EMP){
列表记录=新的ArrayList();
//添加标题记录
add(新字符串[]{“ID”、“Name”、“Role”、“Salary”});
迭代器it=emps.Iterator();
while(it.hasNext()){
Employee emp=it.next();
add(新字符串[]{emp.getId(),emp.getName(),emp.getRole(),emp.getSalary()});
}
退货记录;
}
私有静态列表parseCSVFileAsList()引发IOException{
CSVReader reader=newcsvreader(newfilereader(“employees.csv”),',';
List emps=new ArrayList();
//一次读所有的行
列表记录=reader.readAll();
迭代器迭代器=records.Iterator();
//跳过标题行
iterator.next();
while(iterator.hasNext()){
String[]record=iterator.next();
员工emp=新员工();
emp.setId(记录[0]);
emp.setName(记录[1]);
emp.setRole(记录[2]);
emp.setSalary(记录[3]);
emp.add(emp);
}
reader.close();
系统输出打印LN(emps);
返回EMP;
}
}
这可行吗?
这就是我找不到解决方法的地方
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 parseCSVFileAsList()引发IOException{
CSVReader reader=newcsvreader(newfilereader(“employees.csv”),',';
List csvObjects=new ArrayList();
//一次读所有的行
列表记录=reader.readAll();
String[]columns=null;
字符串[]记录=null;
整数长度=0;
迭代器迭代器=records.Iterator();
//跳过标题行
record=iterator.next();
长度=记录长度;
列=新字符串[长度];
for(int i=0;i
我希望这就足够了。显然,您还必须修改一些其他方法。似乎,如果CSV文件中有相同位置的数据,您需要构造函数重载,而不是简单地添加属性
Employee
类,并在遇到数据时填充它们。我是不是误解了你的问题?@LucianoFiandesio我希望我的代码能够被任何csv文件重用,不管它可能有多少列。现在,我必须通过创建字符串ID、名称、角色、薪水并为其赋值来手动定义它的属性:emp.setId(记录[0]);emp.add(emp);。要确定需要添加多少元素是头文件。您应该考虑使用动态语言,如Groovy,它与java非常类似。或者Javascript。根据您的想法,我试图找出如何将每个元素分配给您的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;
}