12
votes

Déterminez quelle fin de ligne est utilisée dans un fichier texte

Quelle est la meilleure façon de déterminer les terminaisons de ligne utilisées dans un fichier texte (Unix, Windows, Mac)?


2 commentaires

Sachez que pour les fichiers Unicode, il existe un certain nombre de caractères différents qui envisagent des terminaisons de ligne juridique. Ils comprennent: caractère de retour de chariot (U + 000d), caractère d'alimentation de ligne (U + 000A), caractère de retour de chariot (U + 000D) suivi du caractère d'alimentation de ligne (U + 000a), caractère séparateur de ligne (U + 2028), et Le caractère de séparateur de paragraphe (U + 2029). Il existe également parfois un caractère «fin du texte» (U + 0003) qui peut être utilisé légalement comme terminateur de la dernière ligne d'un fichier.


Beaucoup de fichiers ont même un mélange de plusieurs types (HL7, je vous regarde).


7 Réponses :


0
votes

Il y a Environnement.NewLine Bien que cela ne soit que pour déterminer ce qui est utilisé sur le système actuel et ne vous aidera pas à lire des fichiers de différentes sources.

Si c'est la lecture, je cherche généralement \ n (modifier: il n'y en a à l'aide de \ r ) et suppose que la ligne se termine là.


2 commentaires

Hmm, je changerais vos paragraphes - le deuxième paragraphe est une réponse - pas sûr que environnement.Newline est terriblement pertinent.


Il n'y a aucune mention si cela est destiné à lire de diverses sources ou à écrire à plusieurs cibles dans la question, autant que je puisse voir et que la balise était simplement C # à l'époque. J'ai considéré environnement.Newline utile si la question relative à l'écriture "correctement" sur d'autres platformations (mono etc.) par exemple. De toute façon, je n'ai pas passé beaucoup de temps à envisager de commander les paragraphes.



0
votes

J'imagine que vous ne pouviez pas savoir avec certitude, devriez-vous définir cela dans l'éditeur. Vous pouvez utiliser un certain AI, l'algorithme serait:

  1. recherche de chaque type de ligne de ligne, vous recherchez ces caractères spécifiques
  2. Mesurez les distances entre eux.
  3. Si un type a tendance à répéter, vous supposez que c'est le type. Comptez les répétitions et utilisez une certaine mesure de la dispersion.

    Ainsi, par exemple, si vous aviez des répétitions de CRLF à 38, 40, 45, et que c'était dans la tolérance, vous devez par défaut de supposer que la fin de la ligne était la CRLF.


0 commentaires

0
votes

Si c'était moi, je voudrais juste lire le fichier un caractère à la fois jusqu'à ce que je rencontrais le premier \ r ou a \ n . Cela suppose que vous avez une entrée sensoriale.


0 commentaires

2
votes

Je ne ferais que rechercher le fichier pour le premier \ r ou \ n et s'il s'agissait d'un \ n je regarderais au personnage précédent pour voir s'il s'agit d'un \ r , si oui, c'est \ r \ n sinon c'est celui qui a été trouvé.


1 commentaires

Si vous "recherchez le fichier pour le premier \ r ou \ n ", vous savez que le personnage précédent n'est ni de ces deux. Je pense que vous voulez dire regarder le caractère suivant (pour voir si la paire est \ r \ n ).



0
votes

lire la plupart des formats textuels que je cherche habituellement \ n, puis couper () la chaîne entière (les espaces à début et la fin sont souvent redondants).


0 commentaires

3
votes

Voici quelques devinières avancées: lisez le fichier, comptez CRS et LFS

if (CR > LF*2) then "Mac" 
else if (LF > CR*2) then "Unix"
else "Windows"


0 commentaires

16
votes

Notez que les fichiers texte peuvent avoir des terminaisons de ligne incohérentes. Votre programme ne devrait pas s'étouffer à ce sujet. Utilisation de readline sur un StreamReader (et des méthodes similaires) prendra soin de toute ligne possible terminant automatiquement.

Si vous lisez manuellement des lignes d'un fichier, assurez-vous d'accepter les terminaisons de ligne , même si incompatibles. En pratique, cela est assez facile en utilisant l'algorithme suivant:

  • Scannez à l'avance jusqu'à ce que vous trouviez soit CR ou LF.
  • Si vous lisez CR, regarder devant le personnage suivant;
  • Si le personnage suivant est LF, le consommez-le (sinon, remettez-le).

0 commentaires