[Java] Implémentation d'un lecteur de flux de ligne stricte qui lit uniquement avec CrLf.

Pour être clair, je pense que c'est un ** chat qui a été implémenté un million de fois **. Je l'ai implémenté pour une raison quelconque, alors je l'ai téléchargé sur GitHub.

■ Résumé:

◇ Contexte

En guise d'exigence, il est très courant ** "Il est devenu nécessaire d'implémenter un analyseur CSV" **. Personnellement, je n'aime pas le format de fichier CSV car c'est beaucoup de problèmes. Je voudrais voir XML ou JSON comme IF intersystème et adopter d'autres formats de chaînes de caractères structurés. Malheureusement, en raison de diverses circonstances, j'ai décidé de dire ** tout est CSV **.

◇ Je l'ai recherché avant de l'implémenter indépendamment

En bref, ce que je veux, c'est un analyseur CSV, et si possible, une chose aussi boueuse n'est pas quelque chose que je veux écrire moi-même. J'ai donc cherché une bibliothèque utilisable, mais aucune d'entre elles ne m'est venue à l'esprit.

Les points suivants étaient les principaux goulots d'étranglement.

Je veux me débarrasser de la bibliothèque déjà implémentée * (je ne veux pas écrire de code trouble moi-même) *, alors j'ai fait de mon mieux pour la trouver. Après tout, je n'ai pas trouvé de bon produit qui puisse répondre à toutes les exigences.

◇ Exigences de mise en œuvre

--Les données contenues dans CSV contiennent des sauts de ligne * (saut de ligne LF: \ n) *, qui doivent être traités correctement. --Il est fixé comme spécification que le délimiteur d'enregistrement est CrLf et que la rupture de données n'est que Lf.

Eh bien, j'ai lu le fichier texte ligne par ligne, C'est juste une analyse de jeton CSV tout en interrogeant normalement. C'est boueux, mais c'est facile et facile.

Je pensais, mais malheureusement je ne savais pas que ** BufferedReader # readLine () ne fait pas la distinction entre CrLf et Lf **.

Bien que l'analyseur de jetons ait été créé immédiatement, la lecture de la ligne essentielle ne s'est pas bien déroulée, et à la fin il a fallu la faire par lui-même.

■ Code d'implémentation:

Seule la partie logique de base est extraite. J'omets d'autres classes connexes, veuillez donc consulter GitHub pour le montant total.

CrLfReader#next



	public String next()
	{
		this.sb.setLength( 0 );
		
		if ( this.build() )
		{
			return this.sb.toString();
		}
		else
		{
			return null;
		}
	}

CrLfReader#build



	private boolean build()
	{
		if ( this.end )
		{
			return false;
		}
		else
		{
			this.readline( false );
			return true;
		}
	}

CrLfReader.Buffer



	private class Buffer
	{
		private final char[] temp;
		
		private int size;
		private int index;
		private boolean eof;
		
		public Buffer(int size)
		{
			this.temp = new char[max( size, MIN_SIZE )];
			this.size = 0;
			this.index = this.temp.length;
			this.eof = false;
		}
		
		public boolean fill()
		{
			if ( !eof )
			{
				size = reader.read( temp );
				index = 0;
				eof = -1 == size;
			}
			
			return !eof;
		}
		
		
		public boolean seekable()
		{
			return index < size;
		}
		
		public char seek()
		{
			return temp[index++];
		}
	}

CrLfReader#readline



	private static final char CR = '\r';
	private static final char LF = '\n';
	
	private void readline(boolean cr)
	{
		while ( this.buffer.seekable() )
		{
			final char c = this.buffer.seek();
			
			if ( cr )
			{
				if ( LF == c ) return;
				
				this.sb.append( CR );
			}
			
			cr = CR == c;
			
			if ( !cr )
			{
				this.sb.append( c );
			}
		}
		
		
		if ( this.buffer.fill() )
		{
			this.readline( cr );
		}
		else
		{
			if ( cr ) sb.append( CR );
			
			this.end = true;
		}
	}

■GitHub

repository URL https://github.com/sugaryo/sharp4j

class FQN sharp4j.util.io.CrLfReader

De côté

En C #, vous pouvez utiliser yield return pour en faire un utilitaire plus pratique. Java utilisera-t-il l'API Stream?

J'aimerais l'élargir après avoir étudié un peu.

Recommended Posts

[Java] Implémentation d'un lecteur de flux de ligne stricte qui lit uniquement avec CrLf.
[Java] Créer une collection avec un seul élément
Rendre la ligne Java Stream agréable avec Eclipse
[Java] Comment rompre une ligne avec StringBuilder
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
Seul le flux de niveau supérieur peut être parallélisé avec Java Stream.
[MQTT / Java] Implémentation d'une classe qui fait Pub / Sub de MQTT en Java