CSV analyse en Java - travail exemple..?
Je veux écrire un programme pour une école en projet java pour analyser certains CSV je ne sais pas. Je sais, le type de données de chaque colonne - bien que je ne sais pas le délimiteur.
Le problème je n'ai pas encore légèrement savoir comment résoudre est à analyser à la Date ou même des Colonnes DateTime. Ils peuvent être dans l'un des nombreux formats.
J'ai trouvé beaucoup de bibliothèques, mais n'ont aucune idée de qui est le meilleur pour mes besoins:
http://opencsv.sourceforge.net/
http://www.csvreader.com/java_csv.php
http://supercsv.sourceforge.net/
http://flatpack.sourceforge.net/
Le problème est que je suis un total de java débutant. Je crains que non de ces bibliothèques peuvent faire ce dont j'ai besoin ou je ne peux pas les convaincre de le faire.
Je parie qu'il ya beaucoup de gens ici qui ont des exemple de code qui pourrait me faire pas de temps pour ce dont j'ai besoin:
- automatiquement divisé en Colonnes (délimiteur inconnu, Columntypes sont connus)
- fonte à Columntype (doit composer avec $, %, etc.)
- convertir des dates en Java Date du Calendrier ou des Objets
Il serait agréable d'avoir autant d'exemples de code que possible par e-mail.
Merci beaucoup!
COMME
Suis-je manqué quelque chose? Si c'est des données au format CSV, le delimitter est une virgule. Si ce n'est pas le cas, il n'est pas dans le format de Valeurs Séparées par des Virgules.
csv est souvent utilisé ; ou tabulation comme séparateur (essayez un excel en allemand).
csv ne pas avoir n'importe quel type d'info. La devise ou le format de nombre dans excel, mais pas exportées vers un fichier csv.
Techniquement, CSV utilise une virgule, DSV (Séparateur de Valeurs Séparées) utilise la virgule, tabulation, point-virgule, deux-points ou quelque chose d'autre.
OriginalL'auteur Andy Schmidt | 2009-05-09
Vous devez vous connecter pour publier un commentaire.
Il y a un sérieux problème avec l'aide de
pour analyser les fichiers CSV, et c'est parce qu'il peut être virgules dans les valeurs de données, et dans ce cas, vous devez citer, et d'ignorer les virgules entre guillemets.
Il y a un très très moyen simple d'analyser ce:
Il existe de nombreux avantages à cette approche. Notez que chaque personnage est touché EXACTEMENT une fois. Il n'y a pas de lecture à l'avant, en poussant en arrière dans la mémoire tampon, etc. Pas de recherche de l'avance pour la fin de la ligne, et la copie de la ligne avant l'analyse. Cet analyseur fonctionne uniquement à partir de l'eau et crée chaque chaîne de valeur une fois. Il fonctionne sur les lignes d'en-tête, et les lignes de données, vous avez juste à composer avec le retour de la liste qui convient. Vous lui donnez un lecteur, de sorte que le flux sous-jacent a été converti en caractères à l'aide de n'importe quel encodage que vous choisissez. Le cours d'eau peut provenir de toute source: un fichier, un HTTP post, un HTTP get, et vous analysez les flux directement. C'est une méthode statique, donc il n'y a pas d'objet à créer et à configurer, et quand cela retourne, il n'y a pas de mémoire tenu.
Vous pouvez trouver une description complète de ce code, et pourquoi cette approche est privilégiée dans mon billet de blog sur le sujet: La Seule Classe dont Vous avez Besoin pour les Fichiers CSV.
Pattern
classe serait beaucoup plus facile que de cette approche.J'ai beaucoup de gens pensent que, mais en fait, tout simplement parce que vous vous retrouvez avec moins de lignes ne signifie pas que vous avez une solution moins complexe. Le code fourni ne pas faire quelque chose de complexe ou complexe. Il traite avec chaque personnage et il n'a qu'un seul mode majeur: si vous êtes dans une chaîne entre guillemets ou pas. Il est facile de suivre et de débogage si vous avez eu, et il n'est pas "caché" de traitement. J'ai vu beaucoup de MAUVAIS exemples qui utilisent des expressions régulières, et encore ne parviennent pas à analyser correctement. Je serais heureux de regarder un véritable cours d'exécution par exemple, mais je doute que ce soit plus simple que le code ci-dessus.
Mis à part le fait qu'il n'y a pas de CSV standard donc, techniquement, il n'y a pas une telle chose comme un valide CSV analyseur:
Pattern.compile("([^\",]*?|\"(\\\\\"|[^\"])*\"),(.*)");
. C'est la façon la plus simple.Vous avez seulement fait partie du job. Vous devez ensuite "vulgaire" les chaînes qui ont des guillemets autour d'eux, et bien sûr, vous avez besoin de la relativement trivial boucle qui lit le Lecteur, de boucles, pour chacune des valeurs, et met le résultat dans la liste. Sérieusement, il serait intéressant de voir ce que le final de la réelle méthode de travail serait afin de comparer les résultats.
OK au sérieux maintenant...vous êtes juste de fractionnement de poils. C'est la solution de travail. Je ne vais pas inclure mon javadoc, mon journal de déclarations, et ma mère nom de jeune fille dans un commentaire...pour de vrai et que diriez-vous arrêter juste en désaccord pas d'accord. Si vous n'allez pas à fournir une solide raison d'être en désaccord, alors je suis vraiment pas intéressé par une réponse, si nous sommes d'être tout à fait honnête.
OriginalL'auteur AgilePro
Vous avez également la Apache Commons CSV de la bibliothèque, peut-être que c'est ce dont vous avez besoin. Voir le guide. Mise à jour de la Version 1.1 dans 2014-11.
Aussi, pour la toute épreuve édition, je pense que vous aurez besoin de coder vous-même...par
SimpleDateFormat
vous pouvez choisir votre formats, et de préciser les différents types, si l'Date
n'est pas comme n'importe quel de votre pré-pensée types, il n'est pas une Date.Je sais, mais tous les autres sont plus...de toute façon, dans une production, je vous conseille le codage d'un analyseur spécifique, que ce n'est pas trop difficile.
OpenCSV a été mis à jour à 2011-04-15 en fonction de leur SF page.
mise à JOUR Apache Commons CSV n'a réussir en tant que projet. Version 1.1 publié ce mois-ci (2014-11).
OriginalL'auteur Valentin Rocher
Mon approche serait pas être de commencer par l'écriture de votre propre API. La vie est trop courte, et il y a des problèmes plus urgents à résoudre. Dans cette situation, j'ai généralement:
Commencer avec quelque chose de quelqu'un a déjà écrit. Les chances sont, il va faire ce que vous voulez. Vous pouvez toujours écrire votre propre plus tard, si nécessaire. OpenCSV est un bon point de départ.
OriginalL'auteur Brian Clapper
Vous pouvez avoir un coup d'oeil à cette spécification pour CSV. Gardez à l'esprit qu'il n'y est pas officiellement reconnu spécification.
Si vous ne le faites pas maintenant, le délimiteur il ne sera pas possible pour ce faire, vous devez trouver en quelque sorte. Si vous pouvez faire une inspection manuelle du fichier, vous devriez rapidement être en mesure de voir ce que c'est et dur de code dans votre programme. Si le délimiteur peut varier votre seul espoir est d'être en mesure de déduire si, à partir de la mise en forme des données connues. Lorsque Excel importations de fichiers CSV il permet à l'utilisateur de choisir le délimiteur et c'est une solution que vous pourriez utiliser.
OriginalL'auteur willcodejavaforfood
j'ai dû utiliser un fichier csv analyseur de il y a 5 ans. semble qu'il y a au moins deux csv normes: http://en.wikipedia.org/wiki/Comma-separated_values et de ce que fait microsoft excel.
j'ai trouvé ce libaray qui mange à la fois: http://ostermiller.org/utils/CSV.html, mais autant que je sache, il n'a aucun moyen de déduire ce type de données des colonnes.
OriginalL'auteur Ray Tayek
Je suis d'accord avec @Brian Battant. J'ai utilisé SuperCSV comme un analyseur si j'ai eu des résultats mitigés. J'aime la polyvalence, mais il y a certaines situations dans mes propres fichiers csv pour laquelle je n'ai pas été en mesure de concilier "encore". J'ai foi en ce produit et le recommande globalement, je suis en manque juste quelque chose de simple, sans doute, que je fais dans mon propre mise en œuvre.
SuperCSV peut analyser les colonnes dans différents formats, de réaliser des modifications sur les colonnes, etc. Il vaut la peine de prendre un coup d'oeil à voir. Il a d'exemples, et facile à suivre.
La une/seule limitation que je vais avoir est de la capture d'un "vide" de la colonne et de l'analyser en un Entier ou peut-être un vide, etc. Je suis de pointeur null erreurs, mais la documentation javadoc suggère que chacun cellProcessor vérifie les valeurs null en premier. Donc, je suis à blâmer, moi le premier, pour l'instant. 🙂
De toute façon, prendre un coup d'oeil à SuperCSV. http://supercsv.sourceforge.net/
OriginalL'auteur Davidson
Au minimum vous allez avoir besoin de connaître le séparateur de colonne.
OK, disons que je connais le délimiteur. Pouvez-vous me fournir un travail qui montre comment je peux faire cette chose? En particulier mettre les Dates en Java et la conversion des Numéros qui ont des choses lik $, %, etc. ?
Juste si je comprends bien, vous êtes désireux de stocker "$9.99" comme la valeur de 9.99 dans un champ numérique?
OriginalL'auteur Richard West
Fondamentalement, vous aurez besoin de lire le fichier ligne par ligne.
Alors vous aurez besoin de diviser chaque ligne par le séparateur, dire une virgule (CSV est synonyme de valeurs séparées par des virgules), avec
Cela va le transformer en un tableau de chaînes que vous pouvez ensuite manipuler, par exemple avec
Vous aurez besoin de faire cela pour chaque ligne pour envelopper ce code dans une boucle while. (Si vous ne connaissez pas le délimiteur suffit d'ouvrir le fichier dans un éditeur de texte.)
Puis-je demander à ce que le $s et %s stand dans vos dates et de chiffres?
le fractionnement sur les virgules n'est pas sûr - CSVs peut avoir des chaînes de caractères qui contiennent des virgules. Le opencsv et les Apaches bibliothèques prendre soin de l'ensemble de cette analyse - de mieux les utiliser.
OriginalL'auteur Leonard Ehrenfried
Je vous recommande de commencer par tirer votre tâche à part dans ses composants.
Une fois que vous faites cela, il devrait être assez trivial à utiliser l'une des bibliothèques de lien (qui sera très certainement la poignée de la tâche n ° 1). Puis itérer sur les valeurs renvoyées, et cast/convertir chaque Chaîne de valeur à la valeur que vous souhaitez.
Si la question est de savoir comment convertir des chaînes de différents objets, il va dépendre de ce format sont à partir de, et sous quel format vous voulez vivre.
DateFormat.parse(), par exemple, l'analyse des dates de chaînes. Voir SimpleDateFormat rapidement la construction d'un DateFormat pour une certaine représentation de chaîne.
Entier.parseInt() prase entiers à partir de chaînes.
Monnaie, vous devrez décider comment vous voulez capturer. Si vous voulez juste de capture comme un float, puis Flotter.parseFloat() fera l'affaire (il suffit d'utiliser la Chaîne.replace() pour supprimer tous les $ et les virgules avant de l'analyser). Ou vous pouvez analyser en un BigDecimal (si vous n'avez pas de problèmes d'arrondi). Il y a peut être une meilleure classe pour la manipulation de la monnaie (je ne fais pas beaucoup, alors je ne suis pas familier avec ce domaine de la JDK).
OriginalL'auteur Kevin Day
De la rédaction de votre analyseur est amusant, mais il est probable que vous devriez regarder
Ouvrir CSV. Il fournit de nombreuses manières d'accéder à la CSV et permet également de générer un fichier CSV. Et il ne poignée échappe correctement. Comme mentionné dans un autre post, il y a aussi un CSV-analyse lib dans le Apache Commons, mais que l'on n'est pas encore sorti.
OriginalL'auteur Ichthyo