none
Tabular arquivo txt - c# RRS feed

  • Pergunta

  • Prezados, sou novo no forum e em programação e preciso de uma ajuda com c#.

    Preciso tabular um arquivo txt advindo de um software terceiro.
    O conteúdo do txt está abaixo!
    "

    58277  7898274673784 ......................... JOELHO FI     1         1         0      69.69  "


    As colunas são separadas por espaços e meu objetivo é substituir todos os espaços por "|".
    O problema é que entre as colunas existe mais de um espaço, queria  então um metodo para remover todos os espaços consecutivos e adicionar apenas um "|" no lugar

    Ficando assim

    58277|7898274673784|......................... JOELHOFI|1|1|0|69.69  "

    tentei com Replace mas não obtive sucesso!

    Grato,

    Vinicius.

    segunda-feira, 5 de dezembro de 2016 14:27

Respostas

  • Olá,

    Sempre que trabalhamos na padronização de arquivos de terceiros é necessário encontrar um padrão (nem sempre é possível). Nesse seu caso eu pensei na seguinte ordem lógica (que pode ser melhorada):

    1) Substituir dois espaços juntos por um caractere que o texto não contenha

    2) Quebrar cada linha por esse caractere

    3) Eliminar partes que só contenham espaços

    4) Concatenar as partes (eliminando os espaços residuais do início e final) juntamente com um "|"

    O código ficou assim:

                string[] arquivo = File.ReadAllLines(@"CAMINHO_DO_ARQUIVO");
                List<string> list = new List<string>();
                string linha = string.Empty;
                
                foreach (string item in arquivo)
                {
                    linha = string.Empty;
                    item.Replace("  ", "§").Split('§').ToList().ForEach(x => linha += !string.IsNullOrEmpty(x)? x.Trim() + "|" : string.Empty);
                    list.Add(linha);
                }

    OBS: A primeira linha do código apenas lê o arquivo e joga em um array de strings. O resultado do processamento fica salvo na variável list

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 5 de dezembro de 2016 16:06

Todas as Respostas

  • Olá,

    Sempre que trabalhamos na padronização de arquivos de terceiros é necessário encontrar um padrão (nem sempre é possível). Nesse seu caso eu pensei na seguinte ordem lógica (que pode ser melhorada):

    1) Substituir dois espaços juntos por um caractere que o texto não contenha

    2) Quebrar cada linha por esse caractere

    3) Eliminar partes que só contenham espaços

    4) Concatenar as partes (eliminando os espaços residuais do início e final) juntamente com um "|"

    O código ficou assim:

                string[] arquivo = File.ReadAllLines(@"CAMINHO_DO_ARQUIVO");
                List<string> list = new List<string>();
                string linha = string.Empty;
                
                foreach (string item in arquivo)
                {
                    linha = string.Empty;
                    item.Replace("  ", "§").Split('§').ToList().ForEach(x => linha += !string.IsNullOrEmpty(x)? x.Trim() + "|" : string.Empty);
                    list.Add(linha);
                }

    OBS: A primeira linha do código apenas lê o arquivo e joga em um array de strings. O resultado do processamento fica salvo na variável list

    Valeu!


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    André Secco
    Microsoft MSP & MSDN Tech Advisor
    Blog: http://andresecco.com.br
    GitHub: http://github.com/andreluizsecco
    Twitter: @andre_secco

    segunda-feira, 5 de dezembro de 2016 16:06
  • Tudo indica que esse arquivo não é tabulado por espaços, me parece que é um arquivo de registros de tamanho

    fixo, mas não tem como eu confirmar sem ver o restante do arquivo. Você pode verificar se todas as linhas são do

    mesmo tamanho e se aparentemente todos os campos iniciam e terminam no mesma posição.

    Caso seja bastar cortar os dados e formatar da forma que deseja.

    terça-feira, 6 de dezembro de 2016 13:28
  • Vinicius, 

    Não sei se algum elemento pode conter espaço sem ser contado como uma nova coluna, mas o seguinte código conseguiria fazer a substituição de 1 ou mais espaços por um "|" (pipe).

    using System;
    using System.Text.RegularExpressions;
    
    public class Program
    {
    	public static void Main()
    	{
    		String linha = "58277  7898274673784 ......................... JOELHO FI     1         1         0      69.69";
    		
    		Console.WriteLine(Regex.Replace(linha, "(\\s)+", "|"));
    		
    		// Saída: 58277|7898274673784|.........................|JOELHO|FI|1|1|0|69.69
    	}
    }
    Se quiser que a substituição seja apenas nos locais com 2 ou mais espaços, basta substituir o segundo parâmetro do Regex.Replace por (\\s){2,}


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    terça-feira, 6 de dezembro de 2016 14:40