簡體   English   中英

Java csv解析器/編寫器

[英]Java csv parser/writer

我正在嘗試從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();`

顯然它找不到toStringArray() 但我要建造它嗎? 我真的需要它嗎? 如何編輯編輯以使其正常工作?

如果您只是按照您給出的鏈接中的示例,您將看到他們正在做的事情......

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;
    }

基本上,您需要構建一個String []列表。 每個String []代表CSV的單行數據,數組的每個元素都是一個值。 所以,是的,您需要從數據模型構建List並將其傳遞給CSVWriter的writeAll()方法。

列表中的第一個String []是CSV的列標題。 后續的String數組就是數據本身。

Apache Commons CSV

Apache Commons CSV庫可以幫助您閱讀/編寫CSV文件。 它處理CSV格式的幾種變體,包括Oracle使用的變體。

CSVFormat.ORACLE

Employee.java

讓我們為Employee上課。

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 +
                " }";
    }
}

示例應用

創建另一個類來模仿檢索DTO 然后我們寫入CSV文件。

顯然它找不到toStringArray()。 但我要建造它嗎? 我真的需要它嗎? 如何編輯編輯以使其正常工作?

要回答您的特定問題,沒有toStringArray方法從DTO對象的成員變量為CSV創建字段值。

捆綁

將輸入或輸出數據與Java對象的成員變量進行映射的這種想法通常稱為綁定

Java有復雜的綁定庫,可以將對象與XML以及JSON, JAXBJSON-B綁定。 對象可以自動寫出到XML或JSON文本,以及從這樣的XML或JSON文本讀取時“重新補充”回到對象。

但對於具有更簡單庫(如Apache Commons CSV)的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();
        }
    }

}

運行時,我們生成一個文件。

屏幕截圖顯示了CSV文件的數據,三行數據加上標題行,其中包含Id,Name,Role和Salary的列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM