OpenCSV: Comment créer le fichier CSV à partir de POJO personnalisée avec des en-têtes de colonne et une colonne personnalisée positions?
J'ai créé un MappingsBean classe où toutes les colonnes du fichier CSV sont spécifiés. Ensuite, j'ai analyser des fichiers XML et créer une liste de mappingbeans. Puis-je écrire les données dans le fichier CSV comme rapport.
Je suis en utilisant des annotations suivantes:
public class MappingsBean {
@CsvBindByName(column = "TradeID")
@CsvBindByPosition(position = 0)
private String tradeId;
@CsvBindByName(column = "GWML GUID", required = true)
@CsvBindByPosition(position = 1)
private String gwmlGUID;
@CsvBindByName(column = "MXML GUID", required = true)
@CsvBindByPosition(position = 2)
private String mxmlGUID;
@CsvBindByName(column = "GWML File")
@CsvBindByPosition(position = 3)
private String gwmlFile;
@CsvBindByName(column = "MxML File")
@CsvBindByPosition(position = 4)
private String mxmlFile;
@CsvBindByName(column = "MxML Counterparty")
@CsvBindByPosition(position = 5)
private String mxmlCounterParty;
@CsvBindByName(column = "GWML Counterparty")
@CsvBindByPosition(position = 6)
private String gwmlCounterParty;
}
Puis-je utiliser StatefulBeanToCsv
classe d'écrire dans le fichier CSV:
File reportFile = new File(reportOutputDir + "/" + REPORT_FILENAME);
Writer writer = new PrintWriter(reportFile);
StatefulBeanToCsv<MappingsBean> beanToCsv = new
StatefulBeanToCsvBuilder(writer).build();
beanToCsv.write(makeFinalMappingBeanList());
writer.close();
Le problème avec cette approche est que si j'utilise @CsvBindByPosition(position = 0)
de contrôle
la position puis je ne suis pas en mesure de générer des noms de colonne. Si j'utilise @CsvBindByName(column = "TradeID")
alors je ne suis pas en mesure de définir la position des colonnes.
Est-il une manière que je peux utiliser les deux annotations, afin que je puisse créer des fichiers CSV avec des en-têtes de colonne et aussi de contrôle de la position de la colonne?
Ce qui concerne,
Vikram Pathania
Salut Rao,Ce lien ne fonctionne pas
vérifier correctement. il est de travail.
OriginalL'auteur Vikram Pathania | 2017-07-20
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème. Autant que je sache, il n'existe pas de fonction intégrée dans OpenCSV qui va permettre d'écrire de la fève à la CSV personnalisé avec les noms de colonnes et de la commande.
Il existe deux principaux
MappingStrategy
s qui sont disponibles dans OpenCSV de la boîte:HeaderColumnNameMappingStrategy
: qui permet de tracer fichier CVS colonnes de haricot champs fondées sur la coutume de nom; lors de l'écriture de la fève à la CSV cela permet de changer les en-tête de colonne nom, mais nous n'avons aucun contrôle sur l'ordre des colonnesColumnPositionMappingStrategy
: qui permet à la carte de fichier CSV colonnes de haricot champs de colonne en fonction de la commande; lors de l'écriture de la fève à la CSV, nous pouvons contrôler l'ordre des colonnes, mais nous obtenons un vide en-tête (mise en œuvre renvoienew String[0]
comme en-tête)La seule façon que j'ai trouvée pour réaliser à la fois personnalisé et des noms de colonne de la commande est d'écrire votre propre
MappingStrategy
.Première solution: rapide et facile, mais codé en dur
Créer des
MappingStrategy
:Et de l'utiliser dans
StatefulBeanToCsvBuilder
:Dans
MappingsBean
classe, nous avons quittéCsvBindByPosition
annotations - pour le contrôle de la commande (dans cette solutionCsvBindByName
les annotations ne sont pas nécessaires). Grâce à la personnalisation de la cartographie de la stratégie de l'en-tête de colonne les noms sont inclus dans le fichier CSV ainsi obtenu.L'inconvénient de cette solution est que lors du changement de la colonne de la commande par le biais de
CsvBindByPosition
d'annotation que nous avons de changer manuellement aussiHEADER
constante dans notre stratégie de mapping.Deuxième solution: plus de flexibilité
La première solution fonctionne, mais il n'était pas bon pour moi. Basé sur l'accumulation dans les implémentations de
MappingStrategy
je suis venu avec encore une autre mise en œuvre:Vous pouvez utiliser cette stratégie personnalisée en
StatefulBeanToCsvBuilder
exactement ce même que dans la première solution (n'oubliez pas d'invoquermappingStrategy.setType(MappingsBean.class);
, sinon, cette solution ne fonctionnera pas).Actuellement notre
MappingsBean
doit contenir à la fois desCsvBindByName
etCsvBindByPosition
annotations. Le premiers à donner de l'en-tête de colonne nom et le deuxième pour créer de commande de colonnes dans le résultat CSV en-tête. Maintenant, si nous changer (à l'aide d'annotations) soit le nom de la colonne ou de la commande dansMappingsBean
classe, que ce changement pourra être répercuté en sortie de fichier CSV.Je crains que votre suggestion n'a pas fonctionné pour moi. :\ Avez-vous été en mesure de vérifier cela, ou avez-vous juste de déduire à partir de la documentation? Si vous avez un Github-exemple je serais intéressé en se référant à elle de voir ce que je suis absent. Merci! 🙂
Je peux confirmer à la fois de l'OP, les solutions ici a fonctionné pour moi. Merci beaucoup pour l'excellente qualité de détail! Je vais avec votre dynamique de la solution, l'apprécier.
La Solution fonctionne parfaitement, version mise à jour, voir la réponse par Lalji Gajera
OriginalL'auteur sebast26
Corrigé ci-dessus la réponse à la correspondance avec la version la plus récente.
Puis appeler cette fonction pour générer un fichier CSV. J'ai utilisé les Visiteurs comme mon POJO à remplir, mise à jour chaque fois que nécessaire.
Mon haricot annotations ressemble à ceci
Sebast26 réponses ne fonctionne pas avec la 4.3, mais, il n'. Merci!
OriginalL'auteur Lalji Gajera
merci pour ce fil de discussion, il a été vraiment très utile pour moi... j'ai amélioré un peu la solution fournie afin d'accepter aussi des POJO où certains champs ne sont pas annotés (pas fait pour être lu/écrit):
}
OriginalL'auteur Rodrigo Broggi
Si vous n'avez pas getDeclaredAnnotationsByType méthode, mais il faut le nom de votre champ d'origine nom:
beanField.getField().getName()
}
OriginalL'auteur akasha
Je voulais atteindre les mêmes résultats que le sujet de démarreur, mais je voulais aussi être en mesure d'importer CSV généré retour à POJO. Aucune des solutions présentées m'ont aidé à le réaliser.
À la réalisation de mes résultats, j'ai besoin de refuser l'aide de @CsvBindByPosition, parce que dans ce cas - ColumnPositionMappingStrategy a été sélectionnée automatiquement. Par documents: cette stratégie nécessite que le fichier ne prend PAS en avoir un en-tête.
Mais si nous écrivons avec openCSV avec la liaison par nom de colonne - nous avoir un en-tête ajouté automatiquement (on peut l'enlever, mais je trouve qu'il est utile).
Ce que j'ai utilisées pour atteindre l'objectif:
CsvUtils pour lire/écrire csv
POJO pour l'import/export
Personnalisé comparateur de Chaîne prédéfinie de la commande:
Commandé l'écriture pour POJO (réponse à la question initiale)
Lire CSV exporté retour à POJO (plus original de la réplique)
Important: CSV peut être non ordonnée, car nous sommes toujours à l'aide de la liaison par nom:
De conclure:
à l'aide de @CsvBindByName
personnalisé comparateur de
OriginalL'auteur Антон Кумпан
Essayer quelque chose comme ci-dessous:
De l'utiliser ensuite comme suit:
Où les colonnes sont les colonnes de votre haricot et l'Employé est votre bean
OriginalL'auteur Kalya Elisha