none
Ordenar um Arquivo TXT : Sort() RRS feed

  • Pergunta

  • Bom Dia Desenvolvedores!

    tenho um arquivo TXT, tabulado.

    MARIA    15   CASA   

    PEDRO    25   PREDIO

    JOSE       10   LAJE

    Com o código abaixo, eu consigo ordenar começando pela primeira coluna (M, P e J).

    Como ordenar pelo coluna de posição, por exemplo, 10 que é onde há os valores numéricos (10,15,25) ?

    Exemplo : vArqOrdenado.substring(10,05).Sort();   // Eu sei que não existe isso mas, procuro algo parecido...

                var vTodasLinhas = File.ReadLines(@vLetraDriver + vPastaDriver+"\\" +txt_arqent.Text.Trim());
                List<string> vArqOrdenado = vTodasLinhas.ToList();
    
                vArqOrdenado.Sort();
               
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(@vLetraDriver + vPastaDriver + "\\ORDENADO.TXT", true))
                {
                    foreach (string item in vArqOrdenado)
                    {
                        file.WriteLine(item);
                    }
    
                }
    
    Sucesso !!!


    Gilberto Herminio Analista de Desenvolvimento de Sistemas Mogi das Cruzes-SP desenvolvedor.ti@r7.com / gil_haf@ig.com.br

    sexta-feira, 18 de dezembro de 2015 13:34

Respostas

  • Você pode usar um Dicionário de dados para guardar cada item com a Key sendo a chave e depois o Linq orderna para você facilmente!

    string[] linhas = File.ReadAllLines(".\\Base.txt");            
    int numero = 0;
    Dictionary<int, string> items = new Dictionary<int, string>(linhas.Count());
    
    foreach (string linha in linhas)
    {
    	numero = int.Parse(linha.Substring(10, 6).TrimStart().TrimEnd().Trim());
    	items.Add(numero, linha);
    }
    
    File.WriteAllLines(".\\BaseOrdenada.txt", items.OrderBy(c => c.Key).Select(c => c.Value).ToArray());


    Fulvio C

    • Marcado como Resposta Marcos SJ segunda-feira, 16 de maio de 2016 13:59
    sábado, 14 de maio de 2016 13:17

Todas as Respostas

  • Olá Gilberto,

    Você pode criar uma classe que implementa a interface IComparer e criar um método que faz um substring na coluna que você quer ordenar, conforme código abaixo:

     

        class Program
        {
            static void Main(string[] args)
            {
                List<string> list = new List<string>();
                list.Add("MARIA    15   CASA   ");
                list.Add("PEDRO    25   PREDIO   ");
                list.Add("JOSE     10   LAJE   ");
                List<string> listOrderned = Util.Sort(list, 9, 11);
                foreach (var item in listOrderned)
                {
                    Console.WriteLine(item);
                }
                Console.ReadKey();
            }
        }
    
    
        public class SortItem
        {
            public string coluna;
            public string linha;
        }
    
        public class SortItemComparer : IComparer<SortItem>
        {
            public int Compare(SortItem x, SortItem y)
            {
                return string.Compare(x.coluna, y.coluna, true);
            }
        }
    
    
        public class Util
        {
            public static List<string> Sort(List<string> listaTabulada, int posicaoInicialColuna, int posicaoFinalColuna)
            {
                List<SortItem> lst = new List<SortItem>();
                foreach (var item in listaTabulada)
                {
                    lst.Add(new SortItem() { coluna = item.Substring(posicaoInicialColuna, posicaoFinalColuna - posicaoInicialColuna), linha = item });
                }
    
                lst.Sort(new SortItemComparer());
                List<string> retListaTabuladaOrdenada = new List<string>();
                foreach (var item in lst)
    	        {
    		        retListaTabuladaOrdenada.Add(item.linha);
    	        }
    
                return retListaTabuladaOrdenada;
            }
        }
    

    Espero ter ajudado.

    Abs

    sábado, 14 de maio de 2016 01:47
  • Você pode usar um Dicionário de dados para guardar cada item com a Key sendo a chave e depois o Linq orderna para você facilmente!

    string[] linhas = File.ReadAllLines(".\\Base.txt");            
    int numero = 0;
    Dictionary<int, string> items = new Dictionary<int, string>(linhas.Count());
    
    foreach (string linha in linhas)
    {
    	numero = int.Parse(linha.Substring(10, 6).TrimStart().TrimEnd().Trim());
    	items.Add(numero, linha);
    }
    
    File.WriteAllLines(".\\BaseOrdenada.txt", items.OrderBy(c => c.Key).Select(c => c.Value).ToArray());


    Fulvio C

    • Marcado como Resposta Marcos SJ segunda-feira, 16 de maio de 2016 13:59
    sábado, 14 de maio de 2016 13:17