C# - Formatando arquivos textos


Com certa frequência recebo consultas sobre como formatar arquivos textos, e, geralmente, essa é uma tarefa recorrente visto que muitas vezes precisamos gerar arquivos para alimentar sistemas legados. Em muitos casos esses arquivos precisam ter um formato especial, com justificação ou colunas alinhas à direita ou à esquerda ou com preenchimentos de zeros a esquerda ou a direita.

Abaixo temos um exemplo de um arquivo texto em uma formatação específica:

000001    Macoratti    Santos          20120411
000002    Jefferson    Americana    20120417
000003    Miriam        Campinas     20120410
000004    Janice        Catanduva    20120405

A formatação acima pode ser entendida assim:

Na primeira coluna temos o código preenchido com zeros à esquerda, a seguir temos as colunas nome, cidade justificados a esquerda e a data no formato YYYYMMDD.

Tomando como exemplo esta formatação podemos usar os recursos da linguagem C#, especialmente da classe StringBuilder, para realizar esta tarefa num piscar de olhos.

Para ficar mais claro vamos supor que tenhamos um arquivo texto chamado clientes.txt que esta delimitado por virgulas no formato abaixo:

1,Macoratti,Santos,20120411
2,Jefferson,Americana,20120417
3,Miriam,Campinas,20120410
4,Janice,Catanduva,20120405

Nossa tarefa será ler o arquivo acima e gerar um arquivo formatado conforme apresentado no início.

Criando o projeto no Visual C#

Abra então o Visual C# 2010 Express Edition acione o menu File clique em New Project e selecione o template Windows Forms Application informando o nome Formatanto_Textos;

A seguir no formulário padrão form1.cs inclua dois controles ListBox - lstTexto e lstTextoFormatado e dois controles Button - btnLerTxt e btnTxtFormatado conforme o leiaute da figura abaixo:

No início do formulário defina os namespaces usados no projeto conforme abaixo:

using System;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;

Inclua uma classe no projeto que irá representar o conteúdo do nosso arquivo texto.

No menu Project clique em Add Class e informe o nome Clientes.cs e a seguir digite o código abaixo neste arquivo:

namespace Formatando_Textos
{
    public class Cliente
    {
        public int  Codigo { get; set; }
        public string Nome { get; set; }
        public string Cidade { get; set; }
        public string Nascimento { get; set; }
    }
}

Você não precisa necessariamente criar esta classe para fazer a formatação pois pode ler diretamente os seus dados de um dataset, datatable ou datareader.

Agora no evento Click do botão - Ler Arquivo Texto e Formatar - temos o código que irá ler o arquivo texto existente e realizar a formatação desejada.

Para isso inclua o código abaixo neste evento:

      private void btnLerTxt_Click(object sender, EventArgs e)
        {
            StringBuilder sb = new StringBuilder();

            string caminhoArquivo = "C:\\dados\\Clientes.txt";
            
            var consulta = from linha in File.ReadAllLines(caminhoArquivo)
                                  let clienteDados = linha.Split(',')
                                  select new Cliente()
                                  {
                                     Codigo = Convert.ToInt32(clienteDados[0]),
                                     Nome = clienteDados[1],
                                    Cidade = clienteDados[2],
                                    Nascimento = clienteDados[3],
                           };

            foreach (var item in consulta)
            {
                lstTexto.Items.Add(item.Codigo + "," + item.Nome + "," + item.Cidade + "," + item.Nascimento);

                sb.AppendFormat("{0,-8}{1,-20}{2,-10}{3,-10:yyyyMMdd}{4}",
                    item.Codigo.ToString().PadLeft(6, '0'),
                    item.Nome,
                    item.Cidade,
                    item.Nascimento,
                    Environment.NewLine);
            }
            File.WriteAllText(@"c:\dados\Clientes_Formatado.txt", sb.ToString());
        }

Vamos entender o código acima:

Declaramos uma instância da classe StringBuilder : StringBuilder sb = new StringBuilder();

Definimos o caminho e nome do arquivo texto que desejamos formatar: string caminhoArquivo = "C:\\dados\\Clientes.txt";

Realizamos a leitura do arquivo texto (nosso arquivo texto esta delimitado por vírgulas) :

var consulta = from linha in File.ReadAllLines(caminhoArquivo)
let clienteDados = linha.Split(',')
select new Cliente()
{
Codigo = Convert.ToInt32(clienteDados[0]),
Nome = clienteDados[1],
Cidade = clienteDados[2],
Nascimento = clienteDados[3],
};

Percorremos o arquivo lido usando um laço foreach onde fizemos o seguinte:

Exibimos o conteúdo do arquivo texto lido no controle ListBox: lstTexto.Items.Add(item.Codigo + "," + item.Nome + "," + item.Cidade + "," + item.Nascimento)

Realizamos a formatação do arquivo texto:

sb.AppendFormat("{0,-8}{1,-20}{2,-10}{3,-10:yyyyMMdd}{4}",
item.Codigo.ToString().PadLeft(6, '0'),
item.Nome,
item.Cidade,
item.Nascimento,
Environment.NewLine);

O código acima é quem faz a mágica da formatação do arquivo texto.

A chave da formatação dos dados em colunas é o método AppendFormat da classe StringBuilder.

O método AppendFormat acrescenta a string retornada pelo processamento de uma seqüência de formato composto que contém zero ou mais itens de formato, para essa instância.Cada item de formato é substituído pela representação de seqüência de caracteres de um argumento correspondente em uma matriz de parâmetro usando um provedor de formato especificado.

Este método usa os recursos da formatação para construir uma string em um formato desejado usando um conjunto de indexadores chamados de itens de formatação no seguinte formato:

{index, length:formatString}

Onde:

Os itens de formatação usados no exemplo foram:

A parte final do código usar o método ToString da classe StringBuilder para converter o texto StringBuilder para uma string.

File.WriteAllText(@"c:\dados\Clientes_Formatado.txt", sb.ToString());

Usamos o método WriteAllText da classe File que cria um novo arquivo texto, já convertido para string, com o nome e no caminho indicado.

Para ler este arquivo e apresentar o resultado no segundo controle ListBox usamos o código abaixo no evento Click do botão de comando - Ler arquivo texto formatado :

 private void btnTxtFormatado_Click(object sender, EventArgs e)
        {
            //string caminhoArquivo = "C:\\dados\\Clientes_Formatado.txt";
            //string[] consulta = File.ReadAllLines(caminhoArquivo);
            //foreach (var item in consulta)
            //{
            //    lstTextoFormatado.Items.Add(item);
            //}
            using (StreamReader reader = new StreamReader("C:\\dados\\Clientes_Formatado.txt"))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    lstTextoFormatado.Items.Add(line); // escreve no console.
                }
            }
        }

O código que esta comentado obtém o mesmo resultado, sendo uma outra opção para percorrer e exibir o arquivo texto.

Executando o projeto iremos obter o seguinte resultado:

Obs: Para visualizar corretamente a formatação nos controles ListBox defina a fonte Courier New.

Esta é uma das muitas maneira que temos para realizar a formatação de textos. Você pode então planejar a sua formatação definindo os parâmetros do método AppendFormat da classe StringBuilder.

Pegue o projeto completo aqui: Formatando_Textos.zip

Veja os Destaques e novidades do SUPER CD VB 2012 (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Veja mais sistemas completos para a plataforma .NET no Super CD .NET e no Super DVD .NET , confira...

Quer aprender C# ??

Chegou o Super DVD C# 2012 com exclusivo material de suporte e vídeo aulas com curso básico sobre C#.

 

1Co 1:25 Porque a loucura de Deus é mais sábia que os homens; e a fraqueza de Deus é mais forte que os homens.
1Co 1:26
Ora, vede, irmãos, a vossa vocação, que não são muitos os sábios segundo a carne, nem muitos os poderosos. nem muitos os nobres que são chamados.
1Co 1:27
Pelo contrário, Deus escolheu as coisas loucas do mundo para confundir os sábios; e Deus escolheu as coisas fracas do mundo para confundir as fortes;
1Co 1:28
e Deus escolheu as coisas ignóbeis do mundo, e as desprezadas, e as que não são, para reduzir a nada as que são;
1Co 1:29
para que nenhum mortal se glorie na presença de Deus.

Referências:


José Carlos Macoratti