sábado, 24 de agosto de 2013

Preenchendo com zeros a esquerda para ordenar números


Um determinado arquivo contém números de 1 a 1045, mas foram gravados fora de ordem. Ao tentar ordená-lo com o comando

$ cat num.txt | sort

tive como resposta a listagem de todos os números que começam com 1, em seguida os que começam com 2 e assim por diante. Logo, não é a forma esperada e para resolver esta situação é preciso preencher com 0 (zero) até que cada número tenha 4 algarismos. Em outras palavras, ficará assim:

0001, 0002, ..., 0009, 0010, ..., 0099, 0100, ..., 0999, 1000, ..., 1045

O código-fonte que apresento desta vez é da linguagem C#. No IDE Visual Studio, abra um novo projeto e escolha o Template: Console Application. Esta opção chama o prompt de comando que é exclusivamente texto.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace AjeitaParaNumerar
{
    class Program
    {
        static void Main(string[] args)
        {
            int i, quantidade=0;
            Console.WriteLine("Este programa le um arquivo de nome num.txt e coloca 3 zeros se o numero for menor que 10, 2 zeros se maior do que 9 e menor do que 100 e por fim, 1 zero se maior do que 99 e moneor do que 1000.");
            StreamReader sr = new StreamReader("num.txt");

            string leitura;
            
     while ((leitura = sr.ReadLine()) != null)
            {
                quantidade++;
            }

            sr.Close();

            StreamWriter sw = new StreamWriter("ok.txt");
            sr = new StreamReader("num.txt");
            
            for (i = 0; i < quantidade; i++)
            {
                string[] valor = new string[quantidade];
                valor[i] = sr.ReadLine();
                if (Convert.ToInt32(valor[i]) < 10)
                {
                    valor[i] = valor[i].PadLeft(4, '0');
                    sw.WriteLine(valor[i]);
                }

                else if (Convert.ToInt32(valor[i]) > 9 && Convert.ToInt32(valor[i]) < 100)
                {
                    valor[i] = valor[i].PadLeft(4, '0');
                    sw.WriteLine(valor[i]);
                }

                else if (Convert.ToInt32(valor[i]) > 99 && Convert.ToInt32(valor[i]) < 1000)
                {
                    valor[i] = valor[i].PadLeft(4, '0');
                    sw.WriteLine(valor[i]);
                }


                else
                {
                    sw.WriteLine(valor[i]);
                }
            }

            sr.Close();
            sw.Close();
        }
    }
}

Mesmo que o código tenha sido desenvolvido em outro sistema operacional, é possível executá-lo no Linux. Para tal, instale o pacote mono-mcs e em seguida execute a linha de comando com o comando mcs com a seguinte sintaxe:

$ mcs fonte.cs -o nome_do_arquivo

Exemplificando supondo que eu escolhi que nome_do_arquivo seja ajeita.out:

$ mcs Program.cs -o ajeita.out

Como resultado, o arquivo ajeita.out não é executável e para torná-lo, basta usar o procedimento usual de dar permissão de execução:

$ chmod a+x ajeita.out

Finalmente, para executá-lo, faça simplesmente:

$ ./ajeita.out

Ao fim da execução, o arquivo ok.txt foi criado e seu conteúdo é a listagem dos 1045 números com quatro algarismos.

Conclusão: O projeto mono permite uma incrível portabilidade para o Linux. Há muitas facilidades por causa dos métodos prontos do C# e por esta razão, torna o desenvolvimento rápido e capaz de funcionar nos dois sistemas operacionais.

Adicionalmente, ao executar o comando para ordenar os números (cat ok.txt | sort), funcionou perfeitamente.

Nenhum comentário:

Postar um comentário