Comment puis-je utiliser le Système.getProperty(“line.séparateur”).toString()?
J'ai une Chaîne délimitée par des tabulations (représentant une table) qui est passé à ma méthode. Lorsque j'imprime à la ligne de commande, il apparaît comme un tableau avec des lignes:
http://i.stack.imgur.com/2fAyq.gif
La fenêtre de commande est correctement mis en mémoire tampon. Ma pensée est qu'il y a vraiment un caractère de nouvelle ligne avant ou après chaque ligne.
Mon problème est que je veux diviser la chaîne en entrant des chaînes représentant les lignes de la table. Pour l'instant j'ai:
private static final String newLine = System.getProperty("line.separator").toString();
private static final String tab = "\t";
private static String[] rows;
...
rows = tabDelimitedTable.split(newLine); //problem is here
System.out.println();
System.out.println("################### start debug ####################");
System.out.println((tabDelimitedTable.contains(newLine)) ? "True" : "False");
System.out.println("#################### end debug###################");
System.out.println();
de sortie:
################### start debug ####################
False
#################### end debug###################
Évidemment, il y a quelque chose dans la chaîne de raconter l'OS pour commencer une nouvelle ligne. Pourtant, il semblerait qu'elle ne contient pas de caractères de saut de ligne.
L'exécution de la dernière version de JDK sur Windows XP SP3.
Des Idées?
- Pourquoi .toString()? C'est déjà une Chaîne de caractères, sauf si elle est nulle, dans ce cas, vous obtenez une NullPointerException.
- Oui, je voulais juste vous assurer que j'ai été en passant d'une chaîne à la place d'un personnage .split(). J'aurais du lire la documentation sur le .méthode getProperty (), mais l'écriture .toString() a été plus rapide que d'ouvrir mon navigateur lol.
Vous devez vous connecter pour publier un commentaire.
Essayer
Cela devrait résoudre le regex problème.
Également pas si important que cela, mais le type de retour de
est Chaîne donc pas besoin d'appeler toString().
"\r\n"
, ce sera en faitsplit
entre les\r
et\n
la création de faux chaînes vides.Le problème
Vous devez PAS supposons qu'une entrée quelconque fichier texte utilise le "corriger" une plate-forme spécifique de retour à la ligne séparateur. Ce qui semble être la source de votre problème; il a peu à faire avec les regex.
Pour illustrer, sur la plate-forme Windows,
System.getProperty("line.separator")
est"\r\n"
(CR+LF). Toutefois, lorsque vous exécutez votre code Java sur cette plate-forme, vous pouvez très bien avoir à traiter avec un fichier d'entrée dont le séparateur de ligne est tout simplement"\n"
(LF). Peut-être que ce fichier a été créé à l'origine dans la plate-forme Unix, puis transféré en binaire (au lieu de texte) en mode Windows. Il pourrait y avoir de nombreux scénarios où vous pouvez lancer dans ce genre de situation, où vous devez analyser un fichier texte en entrée qui n'utilise pas la plate-forme actuelle est de retour à la ligne de séparation.(Comme par hasard, lorsqu'un Windows fichier texte est transféré à Unix en mode binaire, de nombreux éditeurs d'affichage,
^M
qui confond certaines personnes qui n'ont pas compris ce qui se passait).Lorsque vous êtes la production de un fichier texte en sortie, vous devriez probablement préférer le de la plate-forme de saut de ligne séparateur, mais quand vous êtes consommer un fichier texte en entrée, ce n'est probablement pas sûr de faire l'hypothèse qu'il utilise correctement la plate-forme spécifique de retour à la ligne de séparation.
La solution
Une façon de résoudre le problème est d'utiliser, par exemple,
java.util.Scanner
. Il a unnextLine()
méthode qui peut renvoyer à la ligne suivante (si il existe), gérer correctement une incohérence entre la plate-forme de saut de ligne séparateur d'entrée et le fichier texte.Vous pouvez également combiner les 2
Scanner
, l'une d'analyser le fichier ligne par ligne, et une autre pour analyser les jetons de chaque ligne. Voici un simple exemple d'utilisation qui divise chaque ligne dans unList<String>
. L'intégralité du fichier devient donc unList<List<String>>
.C'est probablement une meilleure approche que la lecture de la totalité du fichier en une énorme
String
et puissplit
en lignes (qui sont ensuitesplit
en parties).Voir aussi
Questions connexes
java.util.Scanner
- a de nombreux exemples de l'utilisation de laEssayer
BufferedReader.readLine()
au lieu de toute cette complication. Il reconnaît tous les possible de la ligne de terminators.Sur Windows, ligne.le séparateur est une combinaison CR/LF (référence ici).
La Java
String.split()
méthode prend un expression régulière. Donc, je pense qu'il y a une certaine confusion ici.Je pense que votre problème est que
String.split()
traite son argument comme une regex, et regexes traiter les retours à la ligne spécialement. Vous pouvez avoir besoin de créer explicitement un objet regex pour passer àsplit()
(il y a une autre surcharge de celui-ci) et configurer cette regex pour permettre des retours à la ligne en passantMULTILINE
dans les drapeaux param dePattern.compile()
. DocsLes autres intervenants sont corrects que split() prend un regex comme argument, de sorte que vous aurez à résoudre en premier. L'autre problème, c'est que vous êtes en supposant que les caractères de saut de ligne sont les mêmes que le système par défaut. Selon l'endroit où les données sont à venir, et où le programme est en cours d'exécution, cette hypothèse peut ne pas être correcte.
Essayez ceci:
Cela devrait fonctionner indépendamment de ce que la ligne délimiteurs sont dans l'entrée, et ignorer les lignes vides.