¿Cómo serializar un objeto en un archivo CSV?

8 minutos de lectura

Quiero escribir un objeto en un archivo CSV. Para XML tenemos XStream como este
Entonces, si quiero convertir un objeto a CSV, ¿tenemos alguna biblioteca de este tipo?

EDITAR:
Quiero pasar mi lista de Bean a un método que debería escribir todos los campos de Bean en CSV.

  • Probablemente un mejor término sería Marshalling/Unmarshaling en lugar de serialización. porque después de organizar sus datos en el formato deseado (csv, xml, ..) puede guardarlos en un archivo. Las siguientes soluciones funcionan, pero tendrían problemas de rendimiento en caso de grandes cantidades de datos. mi sugerencia es utilizar transformadores usando un archivo XSLT como formateador de plantilla csv.

    – Masud

    17 mayo 2019 en 1:49


¿Como serializar un objeto en un archivo CSV
nivas

Primero, la serialización es escribir el objeto en un archivo ‘tal como está’. AFAIK, no puede elegir formatos de archivo y todo. El objeto serializado (en un archivo) tiene su propio ‘formato de archivo’

Si desea escribir el contenido de un objeto (o una lista de objetos) en un archivo CSV, puede hacerlo usted mismo, no debería ser complejo.

Parece Biblioteca Java CSV puedo hacer esto, pero no lo he intentado yo mismo.

EDITAR: Consulte el siguiente ejemplo. Esto no es infalible, pero puedes construir sobre esto.

    //European countries use ";" as 
    //CSV separator because "," is their digit separator
    private static final String CSV_SEPARATOR = ",";
    private static void writeToCSV(ArrayList<Product> productList)
    {
        try
        {
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("products.csv"), "UTF-8"));
            for (Product product : productList)
            {
                StringBuffer oneLine = new StringBuffer();
                oneLine.append(product.getId() <=0 ? "" : product.getId());
                oneLine.append(CSV_SEPARATOR);
                oneLine.append(product.getName().trim().length() == 0? "" : product.getName());
                oneLine.append(CSV_SEPARATOR);
                oneLine.append(product.getCostPrice() < 0 ? "" : product.getCostPrice());
                oneLine.append(CSV_SEPARATOR);
                oneLine.append(product.isVatApplicable() ? "Yes" : "No");
                bw.write(oneLine.toString());
                bw.newLine();
            }
            bw.flush();
            bw.close();
        }
        catch (UnsupportedEncodingException e) {}
        catch (FileNotFoundException e){}
        catch (IOException e){}
    }

Este es el producto (getters y setters ocultos para facilitar la lectura):

class Product
{
    private long id;
    private String name;
    private double costPrice;
    private boolean vatApplicable;
}

Y así es como probé:

public static void main(String[] args)
{
    ArrayList<Product> productList = new ArrayList<Product>();
    productList.add(new Product(1, "Pen", 2.00, false));
    productList.add(new Product(2, "TV", 300, true));
    productList.add(new Product(3, "iPhone", 500, true));
    writeToCSV(productList);
}

Espero que esto ayude.

Salud.

  • +1 escribir es realmente simple, leer es un poco más difícil pero no tanto… y si no hay una nueva línea dentro de los valores de salida, la lectura se vuelve realmente simple…

    – Vinze

    08 sep.

  • no satisface mi requerimiento

    NewBeee_Java

    08 sep.

  • @NewBie_Java: si Java CSV Library no satisface sus requisitos, puede escribir su propia lógica. No es difícil y no hace daño… He agregado una lógica simple sobre cómo hacer esto. Trate de construir sobre eso…

    – Nivas

    14 sep.

¿Como serializar un objeto en un archivo CSV
Riduidel

Para un fácil acceso a CSV, hay una biblioteca llamada OpenCSV. Realmente facilita el acceso al contenido del archivo CSV.

EDITAR

De acuerdo con su actualización, considero que todas las respuestas anteriores son incorrectas (debido a su bajo nivel). ¡Entonces puedes ir por un camino completamente diferente, el camino de hibernación, de hecho!

Al usar el csvjdbc controlador, puede cargar sus archivos CSV como fuente de datos JDBC y luego asignar directamente sus beans a esta fuente de datos.

te hubiera hablado de CSVObjects, pero como el sitio parece estar roto, me temo que la librería no está disponible hoy en día.

  • OpenCSV no satisface mi requisito

    NewBeee_Java

    08 sep.

  • Tengo un requerimiento similar. Según los documentos de la API, la versión 2.4 tiene una clase BeanToCsv. Desafortunadamente, parece que 2.4 aún no se ha lanzado.

    – theblang

    12 nov.

Dos opciones que me acabo de encontrar:

1641817462 712 ¿Como serializar un objeto en un archivo CSV
usuario1057653

Sería interesante tener un serializador csv ya que ocuparía el mínimo espacio en comparación con otros métodos de serialización.

El soporte más cercano para el objeto java a csv es stringutils proporcionado por el proyecto spring utils

arrayToCommaDelimitedString(Objeto[] arr) pero está lejos de ser un serializador.

Aquí hay una utilidad simple que usa la reflexión para serializar objetos de valor

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

}

Aquí hay un objeto de valor de ejemplo

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

}

y el código para ejecutar la utilidad

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

}

Producción:

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

Escribí una clase simple que usa OpenCSV y tiene dos static public métodos.

static public File toCSVFile(Object object, String path, String name) {
    File pathFile = new File(path);
    pathFile.mkdirs();
    File returnFile = new File(path + name);
    try {

        CSVWriter writer = new CSVWriter(new FileWriter(returnFile));
        writer.writeNext(new String[]{"Member Name in Code", "Stored Value", "Type of Value"});
        for (Field field : object.getClass().getDeclaredFields()) {
            writer.writeNext(new String[]{field.getName(), field.get(object).toString(), field.getType().getName()});
        }
        writer.flush();
        writer.close();
        return returnFile;
    } catch (IOException e) {
        Log.e("EasyStorage", "Easy Storage toCSVFile failed.", e);
        return null;
    } catch (IllegalAccessException e) {
        Log.e("EasyStorage", "Easy Storage toCSVFile failed.", e);
        return null;
    }
}

static public void fromCSVFile(Object object, File file) {
    try {
        CSVReader reader = new CSVReader(new FileReader(file));
        String[] nextLine = reader.readNext(); // Ignore the first line.
        while ((nextLine = reader.readNext()) != null) {
            if (nextLine.length >= 2) {
                try {
                    Field field = object.getClass().getDeclaredField(nextLine[0]);
                    Class<?> rClass = field.getType();
                    if (rClass == String.class) {
                        field.set(object, nextLine[1]);
                    } else if (rClass == int.class) {
                        field.set(object, Integer.parseInt(nextLine[1]));
                    } else if (rClass == boolean.class) {
                        field.set(object, Boolean.parseBoolean(nextLine[1]));
                    } else if (rClass == float.class) {
                        field.set(object, Float.parseFloat(nextLine[1]));
                    } else if (rClass == long.class) {
                        field.set(object, Long.parseLong(nextLine[1]));
                    } else if (rClass == short.class) {
                        field.set(object, Short.parseShort(nextLine[1]));
                    } else if (rClass == double.class) {
                        field.set(object, Double.parseDouble(nextLine[1]));
                    } else if (rClass == byte.class) {
                        field.set(object, Byte.parseByte(nextLine[1]));
                    } else if (rClass == char.class) {
                        field.set(object, nextLine[1].charAt(0));
                    } else {
                        Log.e("EasyStorage", "Easy Storage doesn't yet support extracting " + rClass.getSimpleName() + " from CSV files.");
                    }
                } catch (NoSuchFieldException e) {
                    Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e);
                } catch (IllegalAccessException e) {
                    Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e);

                }
            } // Close if (nextLine.length >= 2)
        } // Close while ((nextLine = reader.readNext()) != null)
    } catch (FileNotFoundException e) {
        Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e);
    } catch (IOException e) {
        Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e);
    } catch (IllegalArgumentException e) {
        Log.e("EasyStorage", "Easy Storage fromCSVFile failed.", e);
    }
}

Creo que con alguna recursividad simple, estos métodos podrían modificarse para manejar cualquier objeto Java, pero para mí esto fue adecuado.

Aunque es una respuesta muy tardía, me he enfrentado a este problema de exportar entidades de Java a CSV, EXCEL, etc. en varios proyectos, donde necesitamos proporcionar la función de exportación en la interfaz de usuario.

He creado mi propio marco ligero. Funciona con cualquier Java Beans, solo necesita agregar anotaciones en los campos que desea exportar a CSV, Excel, etc.

Enlace: https://github.com/abhisoni96/dev-tools

1641817462 491 ¿Como serializar un objeto en un archivo CSV
Aggatón

Vale la pena mencionar que la biblioteca del manillar https://github.com/jknack/handlebars.java puede trivializar muchas tareas de transformación, incluido toCSV.

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad