Come serializzare l’object nel file CSV?

Voglio scrivere un object nel file CSV. Per XML abbiamo XStream come questo
Quindi, se voglio convertire un object in CSV, abbiamo una tale libreria?

EDIT: voglio passare la mia lista di bean a un metodo che dovrebbe scrivere tutti i campi di bean in CSV.

Innanzitutto, la serializzazione sta scrivendo l’object su un file “così com’è”. AFAIK, non puoi scegliere i formati di file e tutto. L’object serializzato (in un file) ha il suo ‘formato file’

Se vuoi scrivere il contenuto di un object (o un elenco di oggetti) in un file CSV, puoi farlo da solo, non dovrebbe essere complesso.

Sembra che Java CSV Library possa farlo, ma non l’ho provato da solo.

EDIT : vedi seguente esempio. Questo non è assolutamente infallibile, ma puoi costruirlo.

//European countries use ";" as //CSV separator because "," is their digit separator private static final String CSV_SEPARATOR = ","; private static void writeToCSV(ArrayList 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){} } 

Questo è un prodotto (getter e setter nascosti per la leggibilità):

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

E questo è il modo in cui ho provato:

 public static void main(String[] args) { ArrayList productList = new ArrayList(); 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); } 

Spero che questo ti aiuti.

Saluti.

Per un facile accesso CSV, esiste una libreria chiamata OpenCSV . Facilita l’accesso al contenuto del file CSV.

MODIFICARE

Secondo il tuo aggiornamento, considero tutte le risposte precedenti come non corrette (a causa del loro basso livello). Puoi quindi andare in un modo completamente diverso, il modo di ibernazione, in effetti!

Utilizzando il driver CsvJdbc , è ansible caricare i file CSV come origine dati JDBC e quindi mappare direttamente i bean in questa origine dati.

Ti avrei parlato di CSVObjects , ma dato che il sito sembra interrotto, temo che la lib non sia disponibile al giorno d’oggi.

Sarebbe interessante avere un serializzatore csv in quanto richiederebbe lo spazio minimo rispetto ad altri metodi di serializzazione.

Il supporto più vicino per l’object java a csv è stringutils fornito dal progetto spring utils

arrayToCommaDelimitedString (Object [] arr) ma è ben lungi dall’essere un serializzatore.

Ecco una semplice utility che utilizza la riflessione per serializzare oggetti di valore

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

}

Ecco un object valore di esempio

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

}

e il codice per eseguire l’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); } } 

Produzione:

 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 

Ho scritto una class semplice che utilizza OpenCSV e ha due metodi static public .

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

Penso che con una semplice ricorsione questi metodi possano essere modificati per gestire qualsiasi object Java, ma per me questo era adeguato.

Nonostante la sua risposta molto tardiva, ho affrontato questo problema di esportare le entrate java in CSV, EXCEL ecc. In vari progetti, dove è necessario fornire funzionalità di esportazione sull’interfaccia utente.

Ho creato la mia struttura leggera. Funziona con qualsiasi Java Beans, Hai solo bisogno di aggiungere annotazioni sui campi che vuoi esportare in CSV, Excel ecc.

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