Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Você pode usar um método de extensão que libera uma linha de cada vez para transmitir um arquivo de texto para processamento. Essa técnica reduz os requisitos de memória em comparação com técnicas que carregam todo o arquivo e depois o processa.
O método de extensão pode fornecer a linha usando o constructo yield return
. Uma consulta LINQ pode processar o fluxo de forma lenta e adiada. Se você usar XStreamingElement para transmitir saída, será possível criar uma transformação de arquivo de texto para XML que usa uma quantidade mínima de memória, independentemente do tamanho do arquivo de texto de origem.
Observação
A técnica é melhor aplicada em situações em que você pode processar todo o arquivo uma vez, tomando as linhas em ordem do documento de origem. Processar o arquivo mais de uma vez ou classificar antes do processamento reduz os benefícios de desempenho de uma técnica de streaming.
Exemplo: usar um método de extensão para transmitir texto
O exemplo usa o seguinte arquivo de texto, People.txt, como sua origem:
#This is a comment
1,Tai,Yee,Writer
2,Nikolay,Grachev,Programmer
3,David,Wright,Inventor
No código do exemplo, o método de extensão Lines
fornece ao texto uma linha por vez:
public static class StreamReaderSequence
{
public static IEnumerable<string> Lines(this StreamReader source)
{
if (source == null)
throw new ArgumentNullException(nameof(source));
string line;
while ((line = source.ReadLine()) != null)
{
yield return line;
}
}
}
class Program
{
static void Main(string[] args)
{
var sr = new StreamReader("People.txt");
var xmlTree = new XStreamingElement("Root",
from line in sr.Lines()
let items = line.Split(',')
where !line.StartsWith("#")
select new XElement("Person",
new XAttribute("ID", items[0]),
new XElement("First", items[1]),
new XElement("Last", items[2]),
new XElement("Occupation", items[3])
)
);
Console.WriteLine(xmlTree);
sr.Close();
}
}
O exemplo produz a seguinte saída:
<Root>
<Person ID="1">
<First>Tai</First>
<Last>Yee</Last>
<Occupation>Writer</Occupation>
</Person>
<Person ID="2">
<First>Nikolay</First>
<Last>Grachev</Last>
<Occupation>Programmer</Occupation>
</Person>
<Person ID="3">
<First>David</First>
<Last>Wright</Last>
<Occupation>Inventor</Occupation>
</Person>
</Root>