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.
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 **.
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.
--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.
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
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