11
votes

Couper les espaces de début et de fin dans OpenCsv

J'utilise CSVReader de OpenCSV pour lire des valeurs séparées par des virgules à partir d'un fichier. Je ne sais pas comment couper les espaces de début et de fin. Bien sûr, je pouvais faire string.trim () mais il serait plus propre de ne pas le faire. Dans le Documentation Il n'y a pas d'option de telle spécifiée.


6 commentaires

Comment ce n'est pas "nettoyant" à utiliser string.trim () ?


Parce que je dois écrire une ligne supplémentaire. En outre, il doit créer un nouvel objet entier, donc un peu moins efficace.


Vous ne pouvez pas épargner 1 ligne supplémentaire dans votre code source pour une fonction que vous savez utiliser?


Je conviens que ce serait bien si l'objet Reader CSV a une option pour cela. Il y a une option "ignorer leaderspace" sur le constructeur, mais je suppose que cela n'affecte que les espaces en dehors des citations?


Je pense qu'une bibliothèque de CSV doit mettre le contenu dans les cellules et lire le contenu des cellules exactement comme ils sont. Sa responsabilité se termine là-bas. C'est la responsabilité des développeurs d'utiliser le bon contenu à écrire et de transformer le contenu lu. Je suis sûr que vous pourriez créer une classe, envelopper CSVReader, qui permettrait de couper () tous les champs, puis votre code fait la logique d'entreprise serait plus propre.


Pour ceux qui lisent .csv avec csvtobeanbuilder. J'ai coupé la chaîne sur la méthode de réglage de la propriété de liaison CSV.


3 Réponses :


4
votes

Pouvez-vous basculer sur supercsv code> ? Il a une option d'ignorer les espaces environnants sur son csvpreference.builder code> . C'est une bibliothèque de loin supérieure, imo. Si cette préférence ne fait pas ce que vous voulez, vous pouvez toujours prolonger la classe Tokenizer et remplacer readcolumns code> . Sinon, il ressemble à opencsv code> n'est pas très granulaire et vous demanderait d'étendre csvreader code> et de remplacer readnext code> . Cela pourrait fonctionner:

class MyReader extends au.com.bytecode.opencsv.CSVReader {
    @Override public String[] readNext() throws IOException {
        String[] result = super.readNext();
        for (int i=0; i<result.length; i++) result[i] = result[i].trim();
        return result;
    }
}


2 commentaires

Notez que SuperCSV a été mis à jour le plus récemment en 2015. OpenCsv est actuellement entretenu.


C'est malheureux. Je n'ai pas suivi les changements d'API OpenCsv, donc je ne sais pas combien il est amélioré. Certainement Java.Time Support est un gros problème. Le fait que OpenCSV soit disposé à faire des changements de rupture sur les principales communiqués est un bon signe.



1
votes

Utiliser l'idée de Ngreen, j'ai proposé la solution de travail suivante:

public class CSVReaderExtended extends CSVReader {

    private static final String EXP_ALPHA_AND_DIGITS = "[^a-zA-Z0-9]+";

    public CSVReaderExtended(Reader reader) {
        super(reader);
    }

    @Override
    public String[] readNext() throws IOException {
        String[] result = super.readNext();
        if (result == null)
            return null;

        for (int index = 0; index < result.length; index++) {
            result[index] = result[index].replaceAll(EXP_ALPHA_AND_DIGITS, "");
        }
        return result;
    }
}


0 commentaires

3
votes

Si vous travaillez avec la cartographie des haricots et OPENCSV, je préfère personnellement étendre la majusculation car elle gère les missions de valeur finales à leurs champs associés. Imaginez que vos champs sont séparés par tabulation. Ensuite, vous pourriez avoir du mal à prolonger le CSVReader. En outre, moins de codage est requis.

Dans l'exemple suivant, j'utilise une colonnePositionMappingStrategy, mais le vôtre peut être n'importe quelle autre mise en majuscule que populatéenwbean est dans la classe abstraite parent. P>

private <T> MappingStrategy<T> createMappingStrategy() {
    return new ColumnPositionMappingStrategy<T>() {
        @Override
        public T populateNewBean(String[] line) throws CsvDataTypeMismatchException, CsvConstraintViolationException,
                CsvRequiredFieldEmptyException, CsvValidationException {
            Arrays.setAll(line, (i) -> line[i].trim());
            return super.populateNewBean(line);
        }
    };
}


0 commentaires