Um klar zu sein, ich denke, es ist eine ** Katze, die millionenfach implementiert wurde **. Ich habe es aus irgendeinem Grund implementiert und es auf GitHub hochgeladen.
Als Voraussetzung ist es sehr häufig ** "Es wurde notwendig, einen CSV-Parser zu implementieren" **. Ich persönlich mag das CSV-Dateiformat nicht, weil es viel Ärger macht. Ich möchte XML oder JSON als systemübergreifende IF sehen und andere strukturierte Zeichenfolgenformate übernehmen. Leider habe ich mich aufgrund verschiedener Umstände entschlossen zu sagen, dass ** alles CSV ist **.
Kurz gesagt, ich möchte einen CSV-Parser, und wenn möglich, möchte ich so etwas Schlammiges nicht selbst schreiben. Also suchte ich nach einer Bibliothek, die benutzt werden konnte, aber mir fiel keine ein.
Die folgenden Punkte waren die Hauptengpässe.
Ich möchte die bereits implementierte Bibliothek loswerden * (ich möchte keinen schlammigen Code selbst schreiben) *, also habe ich mein Bestes versucht, ihn zu finden. Schließlich konnte ich kein gutes Produkt finden, das alle Anforderungen erfüllen konnte.
Nun, ich habe die Textdatei Zeile für Zeile gelesen. Es ist nur eine CSV-Token-Analyse, während Sie normal anfragen. Es ist schlammig, aber es ist einfach und leicht.
Ich habe nachgedacht, aber leider wusste ich nicht, dass ** BufferedReader # readLine () nicht zwischen CrLf und Lf unterscheidet **.
Obwohl der Token-Parser sofort erstellt wurde, lief das Lesen der wesentlichen Zeilen nicht gut, und am Ende war es notwendig, ihn selbst zu erstellen.
Nur der Kernlogikteil wird extrahiert. Ich lasse andere verwandte Klassen aus, daher sehen Sie bitte GitHub für den gesamten Betrag.
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
In C # können Sie Yield Return verwenden, um es zu einem bequemeren Dienstprogramm zu machen. Wird Java die Stream-API verwenden?
Ich würde es gerne erweitern, nachdem ich ein wenig studiert habe.
Recommended Posts