Bonne et efficace CSV/TSV Lecteur pour Java
Je suis en train de lire big CSV
et TSV
(Onglet sepperated Fichiers) avec environ 1000000
lignes ou plus. Maintenant, j'ai essayé de lire un TSV
contenant ~2500000
lignes avec opencsv
, mais il me jette un java.lang.NullPointerException
. Il travaille avec les plus petits TSV
Fichiers avec ~250000
lignes. Donc je me demandais si il y a d'autres Libraries
qui prennent en charge la lecture de l'immense CSV
et TSV
Fichiers. Avez-vous des idées?
Tout le monde qui est intéressé dans mon Code (je l'écourter, de sorte Try-Catch
est évidemment invalide):
InputStreamReader in = null;
CSVReader reader = null;
try {
in = this.replaceBackSlashes();
reader = new CSVReader(in, this.seperator, '\"', this.offset);
ret = reader.readAll();
} finally {
try {
reader.close();
}
}
Edit: C'est la Méthode où je construis le InputStreamReader
:
private InputStreamReader replaceBackSlashes() throws Exception {
FileInputStream fis = null;
Scanner in = null;
try {
fis = new FileInputStream(this.csvFile);
in = new Scanner(fis, this.encoding);
ByteArrayOutputStream out = new ByteArrayOutputStream();
while (in.hasNext()) {
String nextLine = in.nextLine().replace("\\", "/");
//nextLine = nextLine.replaceAll(" ", "");
nextLine = nextLine.replaceAll("'", "");
out.write(nextLine.getBytes());
out.write("\n".getBytes());
}
return new InputStreamReader(new ByteArrayInputStream(out.toByteArray()));
} catch (Exception e) {
in.close();
fis.close();
this.logger.error("Problem at replaceBackSlashes", e);
}
throw new Exception();
}
Pourquoi ne pas vous lire vous-même grâce à un BufferedReader?
En fait, je voulais avoir bien conçu ,utilisé le Code et je ne veux pas réinventer la roue, en réalité, c'est la raison pour laquelle tout le monde est à l'aide de libs, je pense. Mais si il n'y a pas que rien ne fonctionne, je vais le faire.
avec que de nombreuses lignes je veux le regarder dans le traitement du fichier en lots: Lire n lignes à partir du fichier, processus de csv, de lire le prochain numéro de lot, etc.
Eh bien, ce pourrait être une solution, merci.
En fait, je voulais avoir bien conçu ,utilisé le Code et je ne veux pas réinventer la roue, en réalité, c'est la raison pour laquelle tout le monde est à l'aide de libs, je pense. Mais si il n'y a pas que rien ne fonctionne, je vais le faire.
avec que de nombreuses lignes je veux le regarder dans le traitement du fichier en lots: Lire n lignes à partir du fichier, processus de csv, de lire le prochain numéro de lot, etc.
Eh bien, ce pourrait être une solution, merci.
OriginalL'auteur Robin | 2012-12-14
Vous devez vous connecter pour publier un commentaire.
Je ne l'ai pas essayé, mais j'avais étudié superCSV plus tôt.
http://sourceforge.net/projects/supercsv/
http://supercsv.sourceforge.net/
Vérifier si cela fonctionne pour vous, 2,5 millions de lignes.
Je vous remercie.
supercsv
poignées2 500 000
lignes assez agréable.Comme un Super CSV développeur, je suis heureux d'entendre cela, mais pour être juste à opencsv, vous êtes lié à courir dans (de mémoire) des problèmes si vous utilisez
reader.readAll()
au lieu de la lecture de chaque ligne et de faire quelque chose avec elle. VotrereplaceBackslashes()
méthode pourrait également exécuter dans les questions que vous êtes en train de rédiger l'intégralité du fichier en mémoire. A votre NPE se produisant lors de la fermeture de l'un de vos jets/lecteurs?Maintenant que je suis de commutation de openCsv à superCsv, je suis assez content de ma décision, parce superCsv semble être très bien documenté et largement utilisé, donc je pense que c'était la bonne décision. Quelle serait votre recommandation à mon
replaceBackslashes()
? Oui le NPE s'est produite quand j'ai essayé de fermer le lecteur.Merci, je vais l'essayer au plus vite.
OriginalL'auteur RuntimeException
Ne pas utiliser un fichier CSV analyseur de parser TSV entrées. Il va se casser si le TSV a des champs avec une citation d'un personnage, par exemple.
univocité-analyseurs est livré avec un TSV analyseur. Vous pouvez analyser un milliard de lignes sans problèmes.
Exemple pour analyser un TSV d'entrée:
Si votre entrée est tellement grosse qu'elle ne peut pas être gardé en mémoire, ce faire:
Divulgation: je suis l'auteur de cette bibliothèque. Il est open-source et libre (Apache V2.0 licence).
Merci! J'ai mis à jour ma réponse.
OriginalL'auteur Jeronimo Backes
Essayez de passer les bibliothèques comme suggéré par
Satish
. Si cela ne fonctionne pas, vous devez diviser le fichier en entier en jetons et de les traiter.De penser que votre
CSV
n'avions pas les caractères d'échappement pour les virgulesEnsuite, vous pouvez les traiter. N'oubliez pas de couper le jeton avant de l'utiliser.
OriginalL'auteur Sri Harsha Chilakapati
Je ne sais pas si cette question est toujours actif mais ici, c'est celui que j'utilise avec succès. Encore peut-être implémenter plusieurs interfaces telles que les Flux ou Itératif, cependant:
OriginalL'auteur Konrad Höffner