Preenchendo com zeros a esquerda para ordenar números
Autor: Murilo Fujita | Publicado: 2013-08-24T12:58:00-03:00



p {margin-right: 50px;}
p {margin-left: 50px;}
p { text-align: justify; }
p { text-indent: 30px; }



  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.