none
Alterar linha de arquivo Texto em C# RRS feed

  • Pergunta

  • Prezados, boa tarde!

    No meu ambiente de trabalho me deparei com uma situação que pra quem sabe somente o básico em programação está sendo difícil de lidar, pois já se passaram 3 dias e eu não consegui sair do lugar.

    Bom vamos lá, temos um sistema que gera um arquivo de saída em .txt. Esse arquivo nos usamos para importar em um sistema contábil.

    O que eu queria é: ler esse arquivo .txt e gerar outro alterando alguns dados. Por exemplo: 

    030000002000126900005080000000003449050000635PROVISAO ALUGUEL 01/2018                              0000000 

    Nesse arquivo existem milhares de linhas, porém, gostaria de copiar esses 3 números "635" que se encontra grifado no exemplo (coluna 42) e colocar nos "000" grifados no final da linha. Gostaria de saber se é possível. Até agora só consegui ler o arquivo e exibir na tela, gostaria que fosse gerado um outro txt com essas linhas alteradas... São milhares de linhas... é um layout de importação. Lembrando que esses números são aleatórios então, cada linha sera 3 números diferentes....

    static void Main(string[] args)
            {           
                StreamReader ler = new         StreamReader(@"c:\dados\Importa.txt");
                while(!ler.EndOfStream)
                {
                    string linha = ler.ReadLine();
                    Console.WriteLine(linha);
                }
                ler.Close();
                Console.ReadKey();
            }

    Gostaria de uma solução para gerar o arquivo alterado, pois até agora o que consegui foi ler e exibir.

    Desde já agradeço.

    Att.

    quinta-feira, 15 de março de 2018 16:38

Respostas

  • Olá, não me lembro perfeitamente, mas o que você pode fazer é dentro do seu WHILE você criar 2 variáveis que armazene uma substring desse valor (365) e a outra você armazene a linha também como uma substring apenas removendo os 3 últimos dígitos, depois disso você concatena esses valores.

    string linha = ler.ReadLine();
    var valor1 = linha.Substring(42,3);

    var valor2 = linha.Substring(0,104);

    linha = string.Concat(valor2, valor1);

    Abs!

     

    Leandro de Agostini MCTS - Web Application, Framework 4

    sexta-feira, 16 de março de 2018 00:13
  • Olá, veja se é isso que você precisa.
    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT = new List<string>();
                while (!ler.EndOfStream) { ListaTXT.Add(ler.ReadLine()); }
    
                for (int i = 2; i < ListaTXT.Count; i++)
                {
                    string linha = ListaTXT[i];
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = linha.Substring(564, 100);
                    var valor3 = linha.Substring(45, 516);
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    Console.WriteLine(linha);
                    Console.ReadKey();
                    i = i + 2;
                }
                ler.Close();
                Console.ReadKey();
            }

    Abs!

    Leandro de Agostini MCTS - Web Application, Framework 4

    • Marcado como Resposta Murilo Stersi sexta-feira, 16 de março de 2018 17:35
    sexta-feira, 16 de março de 2018 13:48
  • Boa tarde Leandro, 

    Uma coisa que eu observando o código acabei percebendo é a seguinte, pode ser que seja uma solução, veja se meu raciocínio funcionaria ou não:

    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT = new List<string>();
                while (!ler.EndOfStream) { ListaTXT.Add(ler.ReadLine()); }
    
                for (int i = 2; i < ListaTXT.Count; i++) //poderiamos inicializar esse i de 0 para ele começar desde a primeira e ir até a ultima. 
                {
    //notei que as linhas que usamos a substring possuem mais de 400 caracteres, podiamos fazer um IF(qtdade de caracteres for maior 400 caracteres) ele entra e executa os passos de substring e concatenação, se não, ele apenas grava a respectiva linha em um novo arquivo. 
                    string linha = ListaTXT[i];
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = linha.Substring(564, 100);
                    var valor3 = linha.Substring(45, 516);
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    Console.WriteLine(linha);
                    Console.ReadKey();
                    i = i + 2; //talvez não precisasse dessa incrementação
                }
                ler.Close();
                Console.ReadKey();
            }

    Poderia funcionar?

    Abraços.

    EDIT: MEU DEUS LEANDRO, ACHO QUE DEU CERTO. DA UMA OLHADA 

    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT = new List<string>();
                while (!ler.EndOfStream) { ListaTXT.Add(ler.ReadLine());}
    
                StreamWriter escreve = new StreamWriter(@"C:\dados\teste1.txt");
                for (int i = 0; i < ListaTXT.Count; i++)
                {
                    string linha = ListaTXT[i];
                    if(linha.Length > 400)
                    {
                        var valor = linha.Substring(0, 42);
                        var valor1 = linha.Substring(42, 3);
                        var valor2 = linha.Substring(564, 100);
                        var valor3 = linha.Substring(45, 516);
                        linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                        escreve.WriteLine(linha);
                    }
                    else
                    {
                        escreve.WriteLine(linha);
                    }                
                    Console.WriteLine(linha);
                }
                ler.Close();
                escreve.Close();
                Console.ReadKey();
            }

    Como faço pra sistema criar o arquivo sozinho com nome aleatório?

    Notei também que ele ta organizando o arquivo em ordem alfabética tem como não fazer isso? Queria deixar exatamente como o arquivo de origem.

    sexta-feira, 16 de março de 2018 16:59
  • Olá Murilo, desculpa a demora em responder mas estava em um cliente.

    Parabéns pelo raciocínio, mas segue um exemplo que eu fiz.....deixei um pequeno desafio para você, onde você vai precisar remover os índices temporários......se precisar me chame...

    Abs!

     StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT_Original = new List<string>();
                List<string> ListaTXT_Alterada = new List<string>();
                int Count = 0;
                string IndiceTemporario = string.Empty;
                while (!ler.EndOfStream)
                {
                    Count += 1;
                    if (Count.ToString().Length == 1)
                    {
                        IndiceTemporario = string.Concat("0", Count);
                    }
                    else
                    {
                        IndiceTemporario = Count.ToString();
                    }
                    ListaTXT_Original.Add(string.Concat(IndiceTemporario, ";", ler.ReadLine()));
                }
                //ALTERAR OS DADOS DA LINHA
                for (int i = 2; i < ListaTXT_Original.Count; i++)
                {
                    string linha = ListaTXT_Original[i];
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = "9-9-9-9-9";// linha.Substring(564, 100);
                    var valor3 = "A-A-A-A-A";// linha.Substring(45, 516);
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    ListaTXT_Alterada.Add(linha);
                    i = i + 2;
                }
                //SUBSTITUIR A LINHA ORIGINAL PELA NOVA
                for (int i = 0; i < ListaTXT_Original.Count; i++)
                {
                    for (int u = 0; u < ListaTXT_Alterada.Count; u++)
                    {
                        if (ListaTXT_Original[i].Substring(0,2) == ListaTXT_Alterada[u].Substring(0, 2))
                        {
                            var LinhaOriginal = ListaTXT_Original[i];
                            var LinhaAlterada = ListaTXT_Alterada[u];
                            ListaTXT_Original[i] = ListaTXT_Original[i].Replace(LinhaOriginal, LinhaAlterada);
                        }
                    }
                }
                ler.Close();

                //OBS: LEMBRE-SE DE REMOVER O INDICE TEMPORARIO
                //SALVAR O NOVO TXT
                string Caminho_Salvar_Lista_Nova = @"c:\temp2\ListaNova.txt";
                using (TextWriter TXT = new StreamWriter(Caminho_Salvar_Lista_Nova))
                {
                    foreach (String Linha in ListaTXT_Original)
                    {
                        TXT.WriteLine(Linha);
                    }
                       
                }
            }


    Leandro de Agostini MCTS - Web Application, Framework 4

    • Marcado como Resposta Murilo Stersi sexta-feira, 16 de março de 2018 20:29
    sexta-feira, 16 de março de 2018 18:38

Todas as Respostas

  • Olá, não me lembro perfeitamente, mas o que você pode fazer é dentro do seu WHILE você criar 2 variáveis que armazene uma substring desse valor (365) e a outra você armazene a linha também como uma substring apenas removendo os 3 últimos dígitos, depois disso você concatena esses valores.

    string linha = ler.ReadLine();
    var valor1 = linha.Substring(42,3);

    var valor2 = linha.Substring(0,104);

    linha = string.Concat(valor2, valor1);

    Abs!

     

    Leandro de Agostini MCTS - Web Application, Framework 4

    sexta-feira, 16 de março de 2018 00:13
  • Olá, não me lembro perfeitamente, mas o que você pode fazer é dentro do seu WHILE você criar 2 variáveis que armazene uma substring desse valor (365) e a outra você armazene a linha também como uma substring apenas removendo os 3 últimos dígitos, depois disso você concatena esses valores.

    string linha = ler.ReadLine();
    var valor1 = linha.Substring(42,3);

    var valor2 = linha.Substring(0,104);

    linha = string.Concat(valor2, valor1);

    Abs!

     

    Leandro de Agostini MCTS - Web Application, Framework 4

    Bom dia Leandro,

    Leandro, graças a você consegui montar a linha usando substring e concatenando, ficou assim:

    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                while (!ler.EndOfStream)
                {
                    string linha = ler.ReadLine();
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = linha.Substring(564, 100);
                    var valor3 = linha.Substring(45, 516);                
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    Console.WriteLine(linha);
                    Console.ReadKey();
                }
                ler.Close();
                Console.ReadKey();

    Porém, o arquivo que eu quero ler, ele possui algumas linhas antes, gostaria de saber se é possível ler as linhas pulando de 2 em 2, por  exemplo:

    linha1 - não quero alterar nada

    linha2 - não quero alterar nada

    linha3 - altero os dados

    linha4 - não quero alterar nada

    linha5 - não quero alterar nada

    linha6 - altero os dados

    Não sei como montar um if que pule de 2 em 2 linhas para leitura e são milhares de linhas esse arquivo. 

    Existe algum modo de fazer desse jeito a leitura? 

    OBS: Vale ressaltar que as linhas que eu quero ler possuem mais de 150 caracteres e as outras não.... 

    Obrigado.



    sexta-feira, 16 de março de 2018 13:08
  • Olá, veja se é isso que você precisa.
    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT = new List<string>();
                while (!ler.EndOfStream) { ListaTXT.Add(ler.ReadLine()); }
    
                for (int i = 2; i < ListaTXT.Count; i++)
                {
                    string linha = ListaTXT[i];
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = linha.Substring(564, 100);
                    var valor3 = linha.Substring(45, 516);
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    Console.WriteLine(linha);
                    Console.ReadKey();
                    i = i + 2;
                }
                ler.Close();
                Console.ReadKey();
            }

    Abs!

    Leandro de Agostini MCTS - Web Application, Framework 4

    • Marcado como Resposta Murilo Stersi sexta-feira, 16 de março de 2018 17:35
    sexta-feira, 16 de março de 2018 13:48
  • Olá, veja se é isso que você precisa.
    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT = new List<string>();
                while (!ler.EndOfStream) { ListaTXT.Add(ler.ReadLine()); }
    
                for (int i = 2; i < ListaTXT.Count; i++)
                {
                    string linha = ListaTXT[i];
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = linha.Substring(564, 100);
                    var valor3 = linha.Substring(45, 516);
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    Console.WriteLine(linha);
                    Console.ReadKey();
                    i = i + 2;
                }
                ler.Close();
                Console.ReadKey();
            }

    Abs!

    Leandro de Agostini MCTS - Web Application, Framework 4

    Cara, era isso mesmo que eu precisava, e não é querendo abusar do seu conhecimento ou da sua boa vontade, mas como eu posso pegar as linhas que não foram lidas e essas que foram alteradas e jogar em um arquivo txt, mas mesma ordem que ele realiza a leitura?

    Alías, como posso escrever elas em outro.txt, precisava que o programa criasse o txt se não existisse. 

    sexta-feira, 16 de março de 2018 14:05
  • Olá, eu te ajudo sim, afinal estamos aqui para ajudar.....me dá um tempo que eu já coloco o código para você.

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    sexta-feira, 16 de março de 2018 14:10
  • Olá, você pode colocar umas 12 linhas do seu TXT para eu usar de exemplo.

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    sexta-feira, 16 de março de 2018 14:14
  • Boa tarde Leandro, 

    Uma coisa que eu observando o código acabei percebendo é a seguinte, pode ser que seja uma solução, veja se meu raciocínio funcionaria ou não:

    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT = new List<string>();
                while (!ler.EndOfStream) { ListaTXT.Add(ler.ReadLine()); }
    
                for (int i = 2; i < ListaTXT.Count; i++) //poderiamos inicializar esse i de 0 para ele começar desde a primeira e ir até a ultima. 
                {
    //notei que as linhas que usamos a substring possuem mais de 400 caracteres, podiamos fazer um IF(qtdade de caracteres for maior 400 caracteres) ele entra e executa os passos de substring e concatenação, se não, ele apenas grava a respectiva linha em um novo arquivo. 
                    string linha = ListaTXT[i];
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = linha.Substring(564, 100);
                    var valor3 = linha.Substring(45, 516);
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    Console.WriteLine(linha);
                    Console.ReadKey();
                    i = i + 2; //talvez não precisasse dessa incrementação
                }
                ler.Close();
                Console.ReadKey();
            }

    Poderia funcionar?

    Abraços.

    EDIT: MEU DEUS LEANDRO, ACHO QUE DEU CERTO. DA UMA OLHADA 

    static void Main(string[] args)
            {
                StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT = new List<string>();
                while (!ler.EndOfStream) { ListaTXT.Add(ler.ReadLine());}
    
                StreamWriter escreve = new StreamWriter(@"C:\dados\teste1.txt");
                for (int i = 0; i < ListaTXT.Count; i++)
                {
                    string linha = ListaTXT[i];
                    if(linha.Length > 400)
                    {
                        var valor = linha.Substring(0, 42);
                        var valor1 = linha.Substring(42, 3);
                        var valor2 = linha.Substring(564, 100);
                        var valor3 = linha.Substring(45, 516);
                        linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                        escreve.WriteLine(linha);
                    }
                    else
                    {
                        escreve.WriteLine(linha);
                    }                
                    Console.WriteLine(linha);
                }
                ler.Close();
                escreve.Close();
                Console.ReadKey();
            }

    Como faço pra sistema criar o arquivo sozinho com nome aleatório?

    Notei também que ele ta organizando o arquivo em ordem alfabética tem como não fazer isso? Queria deixar exatamente como o arquivo de origem.

    sexta-feira, 16 de março de 2018 16:59
  • Olá Murilo, desculpa a demora em responder mas estava em um cliente.

    Parabéns pelo raciocínio, mas segue um exemplo que eu fiz.....deixei um pequeno desafio para você, onde você vai precisar remover os índices temporários......se precisar me chame...

    Abs!

     StreamReader ler = new StreamReader(@"c:\dados\teste.txt");
                List<string> ListaTXT_Original = new List<string>();
                List<string> ListaTXT_Alterada = new List<string>();
                int Count = 0;
                string IndiceTemporario = string.Empty;
                while (!ler.EndOfStream)
                {
                    Count += 1;
                    if (Count.ToString().Length == 1)
                    {
                        IndiceTemporario = string.Concat("0", Count);
                    }
                    else
                    {
                        IndiceTemporario = Count.ToString();
                    }
                    ListaTXT_Original.Add(string.Concat(IndiceTemporario, ";", ler.ReadLine()));
                }
                //ALTERAR OS DADOS DA LINHA
                for (int i = 2; i < ListaTXT_Original.Count; i++)
                {
                    string linha = ListaTXT_Original[i];
                    var valor = linha.Substring(0, 42);
                    var valor1 = linha.Substring(42, 3);
                    var valor2 = "9-9-9-9-9";// linha.Substring(564, 100);
                    var valor3 = "A-A-A-A-A";// linha.Substring(45, 516);
                    linha = string.Concat(valor, valor1, valor3, valor1, valor2);
                    ListaTXT_Alterada.Add(linha);
                    i = i + 2;
                }
                //SUBSTITUIR A LINHA ORIGINAL PELA NOVA
                for (int i = 0; i < ListaTXT_Original.Count; i++)
                {
                    for (int u = 0; u < ListaTXT_Alterada.Count; u++)
                    {
                        if (ListaTXT_Original[i].Substring(0,2) == ListaTXT_Alterada[u].Substring(0, 2))
                        {
                            var LinhaOriginal = ListaTXT_Original[i];
                            var LinhaAlterada = ListaTXT_Alterada[u];
                            ListaTXT_Original[i] = ListaTXT_Original[i].Replace(LinhaOriginal, LinhaAlterada);
                        }
                    }
                }
                ler.Close();

                //OBS: LEMBRE-SE DE REMOVER O INDICE TEMPORARIO
                //SALVAR O NOVO TXT
                string Caminho_Salvar_Lista_Nova = @"c:\temp2\ListaNova.txt";
                using (TextWriter TXT = new StreamWriter(Caminho_Salvar_Lista_Nova))
                {
                    foreach (String Linha in ListaTXT_Original)
                    {
                        TXT.WriteLine(Linha);
                    }
                       
                }
            }


    Leandro de Agostini MCTS - Web Application, Framework 4

    • Marcado como Resposta Murilo Stersi sexta-feira, 16 de março de 2018 20:29
    sexta-feira, 16 de março de 2018 18:38
  • Olá Leandro, que desafio em rs. 

    Poderia me explicar seu raciocínio?  Isso poderá me ajudar quando me deparar com outra situação dessas... 

    Esses indices temporários você usou como teste?

    sexta-feira, 16 de março de 2018 20:31
  • kkkk, o importante é ter chegado lá!

    esses índices devem ser adicionados para o efeito de uma chave no arquivo, tipo um ID de uma tabela, assim com eles você pode realizar qualquer ação sem ter de percorrer pela linha inteira do arquivo.

    Abs!


    Leandro de Agostini MCTS - Web Application, Framework 4

    sexta-feira, 16 de março de 2018 20:37