2010-06-11 21 views
3

Je reçois des fichiers de différents formats provenant de différents systèmes que j'ai besoin d'importer dans notre base de données. Une partie du processus d'importation permet de vérifier la longueur de la ligne pour s'assurer que le format est correct. Nous semblons avoir des problèmes avec les fichiers provenant de systèmes UNIX où un caractère est ajouté. Je suppose que cela est dû au fait que le chariot de retour est encodé différemment sur UNIX et sur la plateforme Windows.Comment identifier/gérer les nouvelles lignes de fichier texte en Java?

Existe-t-il un moyen de détecter sur quel système de fichiers un fichier a été créé, autre que de vérifier le dernier caractère de la ligne? Ou peut-être une façon de lire les fichiers sous forme de texte et non binaire dont je soupçonne le problème?

Merci les gars!

+0

Certains caractères tels que le £ signe livre sterling sont deux octets UTF8. Comment mesurez-vous la longueur? Quel est le jeu de caractères cible dans la base de données? – pjp

+0

Titre et étiquette (systèmes de fichiers) sont trompeurs. – aioobe

Répondre

5

Les systèmes Unix utilisent les terminaisons de ligne \n tandis que Windows utilise \r\n et mac utilise \r. Vous ne pouvez pas détecter le système de fichiers car cela n'a aucune importance. Je peux utiliser \ n sur windows si mon éditeur le supporte par exemple. C'est juste la norme sur ces OS, pas une exigence. La bonne façon - en supposant que vous n'ayez pas une fonction qui jette correctement les jetons quelle que soit la ligne qui termine le fichier - est de rechercher un \ n OR a \ r puis de terminer la ligne courante et de supprimer tous les caractères les données restantes qui sont soit \ r ou \ n avant de commencer la ligne suivante. Toutefois, cela entraînera des problèmes si vous avez des lignes vides et devez les conserver. Dans ce cas, vous devez regarder linebreaks plus attentivement:

  • lors de la lecture d'un \ n, mettre fin à la ligne en cours et commencer à la ligne suivante
  • lors de la lecture d'un \ r, mettre fin à la ligne actuelle et, si le next char est \ n, ignorez-le et lancez la ligne suivante, sinon démarrez immédiatement la nouvelle ligne.
+0

Mac OS classique utilisé pour son terminateur de ligne. Les versions actuelles de Mac OS (essentiellement tout ce qui a été publié au cours des 10 dernières années) utilise \ n – Goibniu

+0

Merci pour votre réponse, je pensais que c'était peut-être le seul moyen ... – rafrafUk

1

La plupart du temps Java gérer différents types de terminaisons de ligne automatiquement, l'analyse syntaxique en silence \n (unix) \r\n (fenêtres) et \r (mac) sans vous déranger (aussi longtemps que vous utilisez un flux de caractères) . Voir les documents pour java.io.FileReader et amis. L'utilisation d'un flux de caractères gère également tous les schémas de codage Unicode possibles.

Si vous souhaitez lire explicitement les séparateurs de ligne, vous devez lire le fichier en tant que flux d'octets. Voir les documents pour java.io.DataInputStream et amis.

0

Existe-t-il un moyen de détecter sur quel système de fichiers un fichier a été créé, autre que de vérifier le dernier caractère de la ligne? Non. Et même vérifier la séquence de terminaison de ligne n'est qu'un indice. Nous pouvons facilement créer des fichiers avec une terminaison de ligne DOS sous UNIX, et et vice versa. Ou peut-être une façon de lire les fichiers en tant que texte et non binaire qui je suspecte est le problème?

Oui. Ouvrez le fichier à l'aide d'un lecteur de fichiers, placez-le dans un lecteur mis en mémoire tampon et utilisez la méthode readLine() pour lire le fichier une ligne à la fois. Cette méthode reconnaît un "\n", "\r" ou "\r\n" en tant que séparateur de lignes, et fonctionne donc pour les fichiers DOS, UNIX et Mac.

est ici un code typique:

Reader r = new FileReader("somefile"); 
    try { 
     BufferedReader br = new BufferedReader(r); 
     String line; 
     while ((line = r.readLine()) != null) { 
      // process line 
     } 
    } finally { 
     r.close(); 
    }