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.