Java csv解析器/编写器

Java csv解析器/编写器,java,csv,Java,Csv,我正在尝试从Oracle检索的一些数据中获取CSV。我只需编写csv,将查询结果作为csv列使用。这是我的代码: // get data final List<myDto> dataCsv = myDao.getdata(); StringWriter writer = new StringWriter(); CSVWriter csvWriter = new CSVWriter(writer,';'); List<String[]&

我正在尝试从Oracle检索的一些数据中获取CSV。我只需编写csv,将查询结果作为csv列使用。这是我的代码:

    // get data
    final List<myDto> dataCsv = myDao.getdata();

    StringWriter writer = new StringWriter();
    CSVWriter csvWriter = new CSVWriter(writer,';');

    List<String[]> result  = toStringArray(dataCsv);
    csvWriter.writeAll(result);
    csvWriter.close();

    return Response.ok(result).header("Content-Disposition", "attachment; filename=" + fileName).build();`
//获取数据
最终列表dataCsv=myDao.getdata();
StringWriter编写器=新的StringWriter();
CSVWriter CSVWriter=新的CSVWriter(writer“;”);
列表结果=ToStringaray(数据CSV);
csvWriter.writeAll(结果);
csvWriter.close();
返回Response.ok(result).header(“内容处置”、“附件;文件名=“+filename”).build()`

显然,它找不到
tostringaray()
。但我必须建造它吗?我真的需要它吗?我必须如何编辑编辑才能使其正常工作?

如果您只是按照您给出的链接中的示例进行操作,您将看到他们在做什么

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;
    }
私有静态列表到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()});
}
退货记录;
}
本质上,您需要构建字符串[]的列表。每个字符串[]表示CSV的一行数据,数组的每个元素都是一个值。因此,是的,您需要从数据模型构建一个列表,并将其传递给CSVWriter的writeAll()方法

列表中的第一个字符串[]是CSV的列标题。随后的字符串数组是数据本身。

Apache Commons CSV 该库可以帮助您完成读取/写入CSV文件的繁琐工作。它处理CSV格式的几种变体,包括Oracle使用的一种

Employee.java
让我们为
员工
创建一个类

package work.basil.example;

import java.util.Objects;

public class Employee {
    public Integer id;
    public String name, role;
    public Integer salary;

    public Employee ( Integer id , String name , String role , Integer salary ) {
        Objects.requireNonNull( id ); // etc.
        this.id = id;
        this.name = name;
        this.role = role;
        this.salary = salary;
    }

    @Override
    public String toString ( ) {
        return "Employee{ " +
                "id=" + id +
                " | name='" + name + '\'' +
                " | role='" + role + '\'' +
                " | salary=" + salary +
                " }";
    }
}
示例应用程序 创建另一个类来模拟检索s。然后我们写入一个CSV文件

显然,它找不到ToStringaray()。但我必须建造它吗?我真的需要它吗?我必须如何编辑才能使其工作

要回答您的具体问题,没有
tostringaray
方法从DTO对象的成员变量为CSV创建字段值

结合 这种用Java对象的成员变量映射输入或输出数据的想法是错误的

Java有复杂的绑定库,分别用XML和JSON绑定对象。对象可以自动写入XML或JSON文本,也可以在从此类XML或JSON文本读取时“重新水合”回对象

但是对于具有简单库(如ApacheCommonsCSV)的CSV,我们分别读取和写入每个对象的每个数据字段。将每个DTO传递给对象成员变量,Commons CSV将使用所需的任何封装引号、逗号和逗号将这些值写入CSV文本

您可以在下面的代码中看到这一点,在这一行:

printer.printRecord( e.id , e.name , e.role , e.salary );
EmployeeIo.java
这里是整个
EmployeeIo.java
文件,其中
Io
表示输入输出

package work.basil.example;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;

public class EmployeeIo {
    public static void main ( String[] args ) {
        EmployeeIo app = new EmployeeIo();
        app.doIt();
    }

    private void doIt ( ) {
        // Mimic a collection of DTO objects coming from the database.
        List < Employee > employees = new ArrayList <>( 3 );
        employees.add( new Employee( 101 , "Alice" , "Boss" , 11_000 ) );
        employees.add( new Employee( 102 , "Bob" , "Worker" , 12_000 ) );
        employees.add( new Employee( 103 , "Carol" , "Worker" , 13_000 ) );

        Path path = Paths.get( "/Users/basilbourque/Employees.csv" );
        this.write( employees , path );
    }


    public void write ( final List < Employee > employees , final Path path ) {
        try ( final CSVPrinter printer = CSVFormat.ORACLE.withHeader( "Id" , "Name" , "Role" , "Salary" ).print( path , StandardCharsets.UTF_8 ) ; ) {
            for ( Employee e : employees ) {
                printer.printRecord( e.id , e.name , e.role , e.salary );
            }
        } catch ( IOException e ) {
            e.printStackTrace();
        }
    }

}
package work.basil.example;
导入org.apache.commons.csv.CSVFormat;
导入org.apache.commons.csv.CSVPrinter;
导入java.io.IOException;
导入java.nio.charset.StandardCharset;
导入java.nio.file.Path;
导入java.nio.file.path;
导入java.util.ArrayList;
导入java.util.List;
公共阶层雇员{
公共静态void main(字符串[]args){
EmployeeIo app=新EmployeeIo();
app.doIt();
}
私有无效doIt(){
//模拟来自数据库的DTO对象集合。
列表employees=newarraylist(3);
添加(新员工(101,“爱丽丝”,“老板”,11_000));
新增(新员工(102人,“鲍勃”,“工人”,12000人);
添加(新员工(103名,“卡罗尔”,“工人”,13_000));
Path Path=Path.get(“/Users/basilbourque/Employees.csv”);
this.write(雇员,路径);
}
公共作废写入(最终列表<员工>员工,最终路径){
try(final CSVPrinter printer=CSVFormat.ORACLE.withHeader(“Id”、“Name”、“Role”、“Salary”)。print(path,StandardCharsets.utf8);){
对于(员工e:员工){
打印记录(e.id、e.name、e.role、e.salary);
}
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
运行时,我们生成一个文件