Java CSV analyseur avec chaîne séparateur (multi-caractères)
Est-il open source Java bibliothèque qui prend en charge de caractères multi- (c'est à dire, Chaîne de longueur > 1) séparateurs (séparateurs) pour CSV?
Par définition, CSV = Valeurs Séparées par des Virgules données avec un seul caractère (',') comme séparateur. Cependant, beaucoup d'autres à caractère unique des alternatives existent (par exemple, l'onglet), faisant CSV de se présenter aux "Valeurs délimitées par des Caractères" de données (essentiellement, DSV: Séparateur de Valeurs Séparées par des données).
Principales de Java bibliothèques open source pour CSV (par exemple, OpenCSV) prendre en charge pratiquement n'importe quel caractère comme séparateur, mais pas de la chaîne (de caractères multi -) délimiteurs. Donc, pour les données séparées par des chaînes de caractères comme "|||" il n'y a pas d'autre choix que de prétraitement de l'entrée, afin de transformer la chaîne de caractères à un seul caractère délimiteur. À partir de là, les données peuvent être analysées comme un seul caractère de valeurs séparées.
Il serait donc sympa si il y avait une bibliothèque qui a soutenu la chaîne de séparateurs en natif, de sorte qu'aucun prétraitement a été nécessaire. Cela signifierait que CSV maintenant pleines de caractère pour "CharSequence de Valeurs Séparées par des données". 🙂
Pas si facile, parce que CSV peut avoir cité les champs, multi-dossiers, etc. Aussi, il existe d'innombrables options sur les devis, les caractères d'échappement, etc. Jetez un oeil à secretgeek.net/csv_trouble.asp pour une drôle de présentation fo les problèmes que vous pouvez rencontrer.
Que serait un besoin, en effet, c'est pourquoi (entre autres raisons) la maturité de la bibliothèque est préférable, mais de tous ceux que j'ai joué avec semblent appuyer sur des caractères séparateurs.
FlatPack semble soutenir seuls les caractères séparateurs.
Comme je l'ai dit dans la question, "Ainsi, pour les données séparées par des chaînes de caractères comme "|||" il n'y a pas d'autre option que de prétraitement de l'entrée, afin de transformer la chaîne de caractères à un seul caractère délimiteur." 🙂
OriginalL'auteur PNS | 2011-12-28
Vous devez vous connecter pour publier un commentaire.
C'est une bonne question. Le problème n'était pas évident pour moi jusqu'à ce que j'ai regardé la la documentation javadoc et se rendit compte que opencsv prend en charge uniquement un caractère séparateur, pas une chaîne de caractères....
Voici un couple de suggestions de solutions de rechange (Exemples en Groovy, peut être converti en java).
Ignorer implicite intermédiaire champs
Continuer à Utiliser OpenCSV, mais ignorer les champs vides. Évidemment, c'est un tricheur, mais il fonctionne parfaitement pour l'analyse bien comportés de données.
ou
Rouler vos propres
Utiliser le Java Chaîne générateur de jetons méthode.
Inconvénient de cette approche est que vous perdez la possibilité d'ignorer les caractères de devis ou d'échapper à des séparateurs..
Mise à jour
Au lieu de pré-traitement des données, la modification de son contenu, pourquoi ne pas combiner les deux approches ci-dessus dans un processus en deux étapes:
Pas très efficace, mais peut-être plus facile que l'écriture de votre propre CSV analyseur 🙂
Je comprends les limites avec les deux solutions. Comme l'a déclaré le champ "ignorer" est vraiment bon pour l'analyse bien comportés de données. Comme vous l'avez remarqué si quelqu'un utilise un nombre incorrect de la séparation de caractères, elle rompt les hypothèses que vous avez faites sur les données. Le "roulement de votre propre" est vraiment à prouver qu'il peut être fait, je n'avais jamais pris la peine, de nouveau, sauf si les données sont très bien comportés. Dans mon expérience, CSV des données est rarement le cas.....
Vous êtes de droite. Mon expérience, aussi, est d'avis que des données au format CSV est souvent pas bien formé. +1
FWIW, voici mon 0,02 euro: Créer un prétraitement Lecteur qui va transformer quelle que soit la séquence de Chaîne dans un Personnage, et de nourrir ce lecteur openCSV.
Peut-être Apache Communes CSV.
OriginalL'auteur Mark O'Connor
Essayer opencsv.
C'est tout ce dont vous avez besoin, y compris (et surtout) le traitement intégré des séparateurs à l'intérieur des valeurs à la cote (par exemple
"a,b", "c"
s'analyse comme["a,b", "c"]
)Je l'ai utilisé avec succès et j'ai bien aimé.
Édité:
Depuis opencsv ne s'occupe que d'un seul caractère séparateurs, vous pouvez contourner ce donc:
Hmmm. Lire la modifier pour la simple contourner
La question n'est pas de la manipulation de toute forme de simples caractères délimiteurs (y compris ceux intégrés), mais la manipulation multi-caractères délimiteurs. 🙂
désolé - a afk - lire la modifier maintenant
Oui, c'est le "prétraitement" étape dont je parlais dans la question, merci.
OriginalL'auteur Bohemian
Aucune de ces solutions n'a fonctionné pour moi, parce qu'ils supposaient que vous pouvez stocker la totalité de fichier CSV dans la mémoire, ce qui facilite la
replaceAll
type d'actions.Je sais que c'est lent, mais je suis allé avec
Scanner
. Il a un nombre surprenant de fonctionnalités, et fait rouler votre propre CSV simple lecteur avec n'importe quelle chaîne que vous voulez comme un délimiteur d'enregistrement. Il vous permet également d'analyser de très grands fichiers CSV (j'ai fait 10 go de fichiers avant), puisque vous pouvez lire les enregistrements un à un.Je préfère une solution plus rapide, mais pas de bibliothèque, j'ai trouvé la prend en charge. FasterXML a eu un billet open pour ajouter cette funcitonality depuis le début de 2017: https://github.com/FasterXML/jackson-dataformats-text/issues/14
OriginalL'auteur Peter