How to serialize object to CSV file?

前端 未结 8 1291
执念已碎
执念已碎 2020-11-27 17:14

I want to write a Object into CSV file. For XML we have XStream like this
So if i want to convert object to CSV do we have any such library ?

EDIT: I w

8条回答
  •  庸人自扰
    2020-11-27 18:15

    It would be interesting to have a csv serializer as it would take up the minimal space compared to other serializing method.

    The closest support for java object to csv is stringutils provided by spring utils project

    arrayToCommaDelimitedString(Object[] arr) but it is far from being a serializer.

    Here is a simple utility which uses reflection to serialize value objects

    public class CSVWriter
    {
    private static String produceCsvData(Object[] data) throws IllegalArgumentException, IllegalAccessException, InvocationTargetException
    {
        if(data.length==0)
        {
            return "";
        }
    
        Class classType = data[0].getClass();
        StringBuilder builder = new StringBuilder();
    
        Method[] methods = classType.getDeclaredMethods();
    
        for(Method m : methods)
        {
            if(m.getParameterTypes().length==0)
            {
                if(m.getName().startsWith("get"))
                {
                    builder.append(m.getName().substring(3)).append(',');
                }
                else if(m.getName().startsWith("is"))
                {
                    builder.append(m.getName().substring(2)).append(',');
                }
    
            }
    
        }
        builder.deleteCharAt(builder.length()-1);
        builder.append('\n');
        for(Object d : data)
        {
            for(Method m : methods)
            {
                if(m.getParameterTypes().length==0)
                {
                    if(m.getName().startsWith("get") || m.getName().startsWith("is"))
                    {
                        System.out.println(m.invoke(d).toString());
                        builder.append(m.invoke(d).toString()).append(',');
                    }
                }
            }
            builder.append('\n');
        }
        builder.deleteCharAt(builder.length()-1);
        return builder.toString();
    }
    
    public static boolean generateCSV(File csvFileName,Object[] data)
    {
        FileWriter fw = null;
        try
        {
            fw = new FileWriter(csvFileName);
            if(!csvFileName.exists())
                csvFileName.createNewFile();
            fw.write(produceCsvData(data));
            fw.flush();
        }
        catch(Exception e)
        {
            System.out.println("Error while generating csv from data. Error message : " + e.getMessage());
            e.printStackTrace();
            return false;
        }
        finally
        {
            if(fw!=null)
            {
                try
                {
                    fw.close();
                }
                catch(Exception e)
                {
                }
                fw=null;
            }
        }
        return true;
    }
    

    }

    Here is an example value object

    public class Product {
    private String name;
    private double price;
    private int identifier;
    private boolean isVatApplicable;
    public Product(String name, double price, int identifier,
            boolean isVatApplicable) {
        super();
        this.name = name;
        this.price = price;
        this.identifier = identifier;
        this.isVatApplicable = isVatApplicable;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(long price) {
        this.price = price;
    }
    public int getIdentifier() {
        return identifier;
    }
    public void setIdentifier(int identifier) {
        this.identifier = identifier;
    }
    public boolean isVatApplicable() {
        return isVatApplicable;
    }
    public void setVatApplicable(boolean isVatApplicable) {
        this.isVatApplicable = isVatApplicable;
    }
    

    }

    and the code to run the util

    public class TestCSV 
    {
    public static void main(String... a)
    {
        Product[] list = new Product[5];
        list[0] = new Product("dvd", 24.99, 967, true);
        list[1] = new Product("pen", 4.99, 162, false);
        list[2] = new Product("ipad", 624.99, 234, true);
        list[3] = new Product("crayons", 4.99,127, false);
        list[4] = new Product("laptop", 1444.99, 997, true);
        CSVWriter.generateCSV(new File("C:\\products.csv"),list);
    }
    
    }
    

    Output:

    Name    VatApplicable   Price   Identifier
    dvd     true            24.99   967
    pen     false           4.99    162
    ipad    true            624.99  234
    crayons false           4.99    127
    laptop  true            1444.99 997
    

提交回复
热议问题