web-dev-qa-db-fra.com

Comment écrire ArrayList <Object> dans un fichier csv

J'ai un ArrayList<Metadata> et je veux savoir s'il existe une API Java permettant de travailler avec des fichiers CSV qui possède une méthode d'écriture qui accepte un ArrayList <> comme paramètre similaire à LinqToCsv dans .Net. Comme je le sais, OpenCSV est disponible, mais la classe CsvWriter n'accepte pas de collection. Ma classe de métadonnées est 

public class Metadata{
    private String page;
    private String document;
    private String loan;
    private String type;
}
ArrayList<Metadata> record = new ArrayList<Metadata>();

une fois que je remplis l'enregistrement, je veux écrire chaque ligne dans un fichier .csv. Veuillez suggérer.

7
Maverick

Il y aura sûrement un tas d'API qui le feront pour vous, mais pourquoi ne pas le faire vous-même pour un cas aussi simple? Cela vous évitera une dépendance, ce qui est une bonne chose pour tout projet de toute taille.

Créez une méthode toCsvRow() dans Metadata qui joint les chaînes séparées par une virgule.

public String toCsvRow() {
    return Stream.of(page, document, loan, type)
            .map(value -> value.replaceAll("\"", "\"\""))
            .map(value -> Stream.of("\"", ",").anyMatch(value::contains) ? "\"" + value + "\"" : value)
            .collect(Collectors.joining(","));
}

Collectez le résultat de cette méthode pour chaque objet Metadata séparé par une nouvelle ligne.

String recordAsCsv = record.stream()
        .map(Metadata::toCsvRow)
        .collect(Collectors.joining(System.getProperty("line.separator")));

EDIT Si vous n’êtes pas assez chanceux pour disposer de Java 8 et de l’API Stream, votre utilisation de la liste traditionnelle serait presque aussi simple.

public String toCsvRow() {
    String csvRow = "";
    for (String value : Arrays.asList(page, document, loan, type)) {
        String processed = value;
        if (value.contains("\"") || value.contains(",")) {
            processed = "\"" + value.replaceAll("\"", "\"\"") + "\"";
        }
        csvRow += "," + processed;
    }
    return csvRow.substring(1);
}
10
Henrik

En utilisant CSVWriter , vous pouvez convertir le ArrayList en un tableau et le transmettre au rédacteur.

csvWriter.writeNext(record.toArray(new String[record.size()]));
1
Arnaud

Si vous avez une ArrayList of Objects (métadonnées dans votre cas), vous utiliserez BeanToCSV au lieu de CSVWriter. 

Vous pouvez consulter le BeanToCSVTest dans le code source opencsv pour des exemples d'utilisation. 

0
Scott Conway