2010-12-01 9 views
1

Je suis l'un des développeurs sur une plate-forme qui, entre autres fonctionnalités, permet aux utilisateurs de télécharger des fichiers de données (à partir de sources disparates) pour le traitement avec différents scripts.Y a-t-il un FilterInputStream pour convertir r à la nouvelle ligne du système local?

Un problème persiste avec les fichiers de données séparés par des onglets d'Excel pour Mac. Excel pour Mac (même OS X) termine ses lignes avec des caractères CR (\ r); la norme Linux (et moderne Mac) est LF (\ n). (Windows est CR LF, alias \ r \ n.) Les scripts s'exécutent sur une machine Linux, donc ils ne parviennent absolument pas à identifier les caractères simples comme terminateurs de ligne. Sur le backend, nous introduisons un InputStream dans un nœud JCR via son API habituel. Je voudrais un FilterInputStream qui fait la conversion de flux de ligne pour nous. Ce n'est pas beaucoup de code pour l'écrire nous-mêmes, mais c'est pour les cas évidents; S'il y a une bibliothèque en conserve pour le faire, nous préférerions beaucoup cela, en espérant que d'autres personnes auront travaillé sur les conditions de pointe pour nous. Y a-t-il une bibliothèque open-source qui convertit pratiquement tous les formats de saut de ligne standard en LF (ou le caractère de saut de ligne système) dans un FilterInputStream ou un autre InputStream? Quelques recherches sur Google n'ont rien révélé d'évident, mais je serais étonné s'il n'y avait pas quelque chose.

Si ce n'est pas le cas, quelles sont les conditions de bord susceptibles de me tirer dans le pied en l'écrivant?

+4

Si vous pouvez trouver un moyen de faire en sorte que tous ces programmes Darwin ** cessent d'utiliser MacRoman ** et cessent d'émettre CR pour les sauts de ligne, le monde chantera sûrement des chansons de vos enfants jusqu'aux enfants de vos enfants. Puissent-ils émettre des UTF-8 avec des sauts de ligne de NL, et qu'ils maintiennent leur héritage brisé en suspens pour toujours. ** AMEN ** – tchrist

Répondre

0

Utilisez BufferedReader.readLine(). Cela va analyser et supprimer les terminateurs de ligne présents. Ensuite, lors de l'écriture de chaque ligne à l'extrémité arrière, ajoutez n'importe quel terminateur de ligne que vous aimez.

+0

Il y a deux problèmes avec 'BufferedReader.readLine()'. Tout d'abord, vous ne pouvez pas savoir si vous avez 0, 1 ou 2 caractères sur la lecture, ce qui compte parfois: vous ne pouvez pas copier un fichier avec! L'autre problème est ce que vous couchez dessus. Si vous utilisez un 'InputStreamReader', sachez que ** 3 DE 4 DE SES CONSTRUCTEURS SONT BRISÉS ET INUTILISABLES !!! ** Et celui qui fonctionne est celui que personne n'utilise jamais. :( – tchrist

+0

J'utilise l'interface d'Apache pour un référentiel de contenu Java.Il prend l'InputStream directement, le faire passer dans un BufferedReader m'obligerait à streamer le fichier entier en mémoire via un StringWriter/StringReader/quelque chose pour le transformer en Stream Je vais vérifier les points d'entrée alternatifs pour ses API JCR, mais tchrist est correct ici –

0

Étant donné que vous vous souciez des fichiers CSV, vous en souciez-vous? Si ce n'est pas le cas, écrivez simplement votre propre filtre qui convertit tous les consécutifs (\ n \ r) + en un seul \ n et vous êtes défini. Notez que les lignes vides ne produisent pas de lignes vides.

+0

Malheureusement, je ne peux pas supposer que tous mes fichiers sont des CSV. Je vais écrire un FilterInputStream assez intelligent pour identifier les non-textes -comme des fichiers et éviter de les endommager. –