Ecco un semplice parser ho usato dove serve (di solito se lo streaming non è un fondamentale appena letto e .Split fa il lavoro), non troppo ottimizzato, ma dovrebbe funzionare bene:
(è più di una scissione come metodo - più note qui sotto)
public static IEnumerable<string> Split(this Stream stream, string delimiter, StringSplitOptions options)
{
var buffer = new char[_bufffer_len];
StringBuilder output = new StringBuilder();
int read;
using (var reader = new StreamReader(stream))
{
do
{
read = reader.ReadBlock(buffer, 0, buffer.Length);
output.Append(buffer, 0, read);
var text = output.ToString();
int id = 0, total = 0;
while ((id = text.IndexOf(delimiter, id)) >= 0)
{
var line = text.Substring(total, id - total);
id += delimiter.Length;
if (options != StringSplitOptions.RemoveEmptyEntries || line != string.Empty)
yield return line;
total = id;
}
output.Remove(0, total);
}
while (read == buffer.Length);
}
if (options != StringSplitOptions.RemoveEmptyEntries || output.Length > 0)
yield return output.ToString();
}
... e si può semplicemente passare a char delimitatori, se necessario, basta sostituire il
while ((id = text.IndexOf(delimiter, id)) >= 0)
... con
while ((id = text.IndexOfAny(delimiters, id)) >= 0)
(e id++
invece di id+=
e una firma this Stream stream, StringSplitOptions options, params char[] delimiters
)
... rimuove anche vuoto ecc
Speranza che aiuta
Perché non usando ReadLine() e quindi cercare delimitatore nella stringa? –
Usando 'Peek()' e 'StringBuilder' stai praticamente replicando cosa' ReadLine() 'fa all'interno di' StreamReader' ... quindi mi sembra strano che sia così lento; puoi pubblicare ciò che hai provato? – digEmAll
Inefficiente? Quanto inefficiente? Le prestazioni mancano sensibilmente? –