Ir para o conteúdo
Drak_PT

[Resolvido] Formatação de texto

Mensagens Recomendadas

Drak_PT

Olá amigos alguem me poderia ajudar a criar algo que me formata-se um arquivo de texto com a seguinte ordem:

Texto original:

---------------------------------------------------------
Nome mais alguma coisa

12.50%

---------------------------------------------------------
Nome mais alguma coisa

6.25%

---------------------------------------------------------
Nome mais alguma coisa

3.13%

Eu precisava que fica-se assim:

---------------------------------------------------------
"Nome mais alguma coisa 12.50%"
---------------------------------------------------------
"Nome mais alguma coisa 6.25%"
---------------------------------------------------------
"Nome mais alguma coisa 3.13%"

Já procurei por exemplos para ver se conseguia fazer isto mas ate agora nao consegui nada infelizmente.

Desde ja o meu obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado

Penso que o que precisas é procurar o padrão, e agir sobre ele.

Exemplo (precisas de, nesta ordem):

  • Eliminar linhas em branco
  • Copiar o texto das linhas numéricas para o final da linha anterior
  • Eliminar a linha numérica

Sugiro-te fazer um ciclo que corra todas as linhas e que a cada uma, teste que tipo de linha é e execute esses 3 passos, se aplicáveis.

 

  • Voto 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Drak_PT
3 horas atrás, nunopicado disse:

Penso que o que precisas é procurar o padrão, e agir sobre ele.

Exemplo (precisas de, nesta ordem):

  • Eliminar linhas em branco
  • Copiar o texto das linhas numéricas para o final da linha anterior
  • Eliminar a linha numérica

Sugiro-te fazer um ciclo que corra todas as linhas e que a cada uma, teste que tipo de linha é e execute esses 3 passos, se aplicáveis.

 

Obrigado pela sua resposta,  acho que me vai facilitar no que devo pesquisar e fazer.

Sou apenas um curioso em programação e agora precisava mesmo desta função porque o arquivo de texto tem mais de 13 mil linhas, fazer manualmente demoraria uma eternidade.

Irei manter o tópico actualizado.

Editado por Drak_PT

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nunopicado
Agora, Drak_PT disse:

Obrigado pela sua resposta,  acho que me vai facilitar no que devo pesquisar e fazer.

Espero que sim, mas alguma coisa, apita. :)

  • Voto 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Drak_PT
Em 31/08/2018 às 13:29, nunopicado disse:

Espero que sim, mas alguma coisa, apita. :)

Boas amigo infelizmente estou preso na função de identificar as linhas numéricas e copiar para a linha anterior...

Estive a ler sobre regex mas nao consigo perceber de maneira nenhuma podes dar uma ajuda?

Actualmente tenho o código a ler o documento e a eliminar as linhas em branco e a criar o novo documento.

using System;
using System.IO;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            var tempFileName = Path.GetTempFileName();
            try
            {
                using (var streamReader = new StreamReader("C:\\Original.txt"))
                using (var streamWriter = new StreamWriter(tempFileName))
                {
                    string line;
                    while ((line = streamReader.ReadLine()) != null)
                    {
                        if (!string.IsNullOrWhiteSpace(line))
                            streamWriter.WriteLine(line);
                    }
                }
                File.Copy(tempFileName, "C:\\Corrigido.txt", true);
            }
            finally
            {
                File.Delete(tempFileName);
            }
        }
    }
}

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ricardo Voigt
11 horas atrás, Drak_PT disse:

Boas amigo infelizmente estou preso na função de identificar as linhas numéricas e copiar para a linha anterior...

Estive a ler sobre regex mas nao consigo perceber de maneira nenhuma podes dar uma ajuda?

Actualmente tenho o código a ler o documento e a eliminar as linhas em branco e a criar o novo documento.

Ola,

segue uma ideia... espero que consiga fazer funcionar... :-)

string line;
string line2;
while ((line = streamReader.ReadLine()) != null)
{
	if (!string.IsNullOrWhiteSpace(line))
	{
		if (line == '---------------------------------------------------------')
		{
			streamWriter.WriteLine(line);
			line2 = '';
		}
		else
		{
			if (line2 == ''){
				line2 = line;
			}
			else
			{
				line2 = line2 + " " + line;
				streamWriter.WriteLine(line2);
			}
		}
	}
}

Atenciosamente,

Ricardo

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Drak_PT
7 horas atrás, Ricardo Voigt disse:

Ola,

segue uma ideia... espero que consiga fazer funcionar... 🙂


string line;
string line2;
while ((line = streamReader.ReadLine()) != null)
{
	if (!string.IsNullOrWhiteSpace(line))
	{
		if (line == '---------------------------------------------------------')
		{
			streamWriter.WriteLine(line);
			line2 = '';
		}
		else
		{
			if (line2 == ''){
				line2 = line;
			}
			else
			{
				line2 = line2 + " " + line;
				streamWriter.WriteLine(line2);
			}
		}
	}
}

Atenciosamente,

Ricardo

Vamos ver como me vou sair...

Obrigado pela atenção.

ps: Vou manter o tópico actualizado do progresso.

 

Update: Infelizmente os meus conhecimentos não chegam para corrigir os erros apresentados no código. :(

Editado por Drak_PT

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ricardo Voigt
4 horas atrás, Drak_PT disse:

Update: Infelizmente os meus conhecimentos não chegam para corrigir os erros apresentados no código

Ola

Quais erros ?

Att

Ricardo

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ricardo Voigt
7 horas atrás, Drak_PT disse:

https://image.ibb.co/cVG6QK/Sem_T_tulo.png

mais uma vez obrigado pela disponibilidade.

Detalhe... 🙂

Tenta trocar os caracteres de aspa simples ' pelo caractere de aspas duplas "

Outra coisa.. 

Troca tambem a linha

if (line2 == "")

Por

if (string.IsNullOrWhiteSpace(line2))

Att

Ricardo

Editado por Ricardo Voigt
Outra coisa...
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Drak_PT
2 horas atrás, Ricardo Voigt disse:

Que pena... aqui não tenho o C# pra testar, veja na imagem abaixo como a ideia funcionou no Lazarus IDE... 

https://drive.google.com/file/d/11ZXHAZVVa-7oOUEs9iiji5tWPPpyloxt/view

Att

Ricardo

Poderias compilar e partilhar o que tens actualmente?

Isso ja me ajudaria so teria de copiar e colar o texto.

Mas vou procurar seguir o teu exemplo pode ser algo aqui em falta agora.

 

Update: Achei o erro o codigo sem erros assim:

var tempFileName = Path.GetTempFileName();
            try
            {
                using (var streamReader = new StreamReader("C:\\Teste.txt"))
                using (var streamWriter = new StreamWriter(tempFileName))
                {
                    string line;
                    string line2;
                    while ((line = streamReader.ReadLine()) != null)
                    {
                        if (!string.IsNullOrWhiteSpace(line))
                        {
                            if (line == "---------------------------------------------------------")
                            {
                                streamWriter.WriteLine(line);
                                line2 = "";
                            }
                            else
                            {
                                if (!string.IsNullOrWhiteSpace(line2 = ""))
                                {
                                    line2 = line;
                                }
                                else
                                {
                                    line2 = line2 + " " + line;
                                    streamWriter.WriteLine(line2);
                                }
                            }
                        }
                    }
                }
                File.Copy(tempFileName, "C:\\teste2.txt", true);
            }
            finally
            {
                File.Delete(tempFileName);
            }

O problema e que o texto nem sempre tem a linha seguinte: ---------------------------------------------------------

 

Dai ele ficar em branco ou mal formatado.

se tiver o texto assim funciona:

---------------------------------------------------------
Nome mais alguma coisa
12.75% 	
---------------------------------------------------------
Nome mais alguma coisa
11.75% 	
---------------------------------------------------------
Nome mais alguma coisa
15.75% 	
---------------------------------------------------------
Nome mais alguma coisa
8.75%
---------------------------------------------------------

Mas caso tenha pelo meio algo assim ja nao funciona:

---------------------------------------------------------
Nome mais alguma coisa
12.75% 	

Nome mais alguma coisa
11.75% 	

Nome mais alguma coisa
15.75% 	

Nome mais alguma coisa
8.75%

Acredito que seja possível contornar isto nao?

Peço desculpa por estar a dar este trabalho e uma vez mais obrigado.

Editado por Drak_PT

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Ricardo Voigt
3 horas atrás, Drak_PT disse:

O problema e que o texto nem sempre tem a linha seguinte: ---------------------------------------------------------

Entendo... assim então não há um padrão definido... 😞

Sugiro desconsiderar também esta linha de hífens...

Tente fazer em 2 etapas:

primeiro remova as linhas vazias,

e depois faça a concatenação de cada linha com a linha seguinte... :-)

 

Atenciosamente,

Ricardo

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Drak_PT

Boas rapaziada estou a ficar desesperado pois nao consigo encontrar uma solução alguém mais pode ajudar?

apenas quero colocar as linhas numéricas a frente da linha anterior, fechadas pelas aspas: ""

Exemplo:

---------------------------------------------------------

"Nome mais alguma coisa 8.75%"

"Nome mais alguma coisa 12.75%"

 

a base do texto é:

---------------------------------------------------------

Nome mais alguma coisa

12.75%

Nome mais alguma coisa

11.75%

Nome mais alguma coisa

15.75%

Nome mais alguma coisa

8.75%

---------------------------------------------------------

Nome mais alguma coisa

12.75%

Nome mais alguma coisa

11.75%

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Rechousa

Viva,

Porque não fazes o seguinte:

  • percorres todas as linhas do documento. para cada linha:
    • verificas se é numérico. se não for, guardas numa variável temporária (que será a "linha anterior")
    • se for, concatenas à "linha anterior" e guardas outro objecto (lista de strings ou StringBuilder) ou renderizas (console.writeline)

Eu esquecia o tracinhos, por exemplo - só estão a causar ruído para resolveres o teu problema.

 

  • Voto 1

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Drak_PT
9 horas atrás, Rechousa disse:

Viva,

Porque não fazes o seguinte:

  • percorres todas as linhas do documento. para cada linha:
    • verificas se é numérico. se não for, guardas numa variável temporária (que será a "linha anterior")
    • se for, concatenas à "linha anterior" e guardas outro objecto (lista de strings ou StringBuilder) ou renderizas (console.writeline)

Eu esquecia o tracinhos, por exemplo - só estão a causar ruído para resolveres o teu problema.

 

Boas amigo, o meu problema e que nao sei como fazer, nao quero mentir mas estou nisto a mais de 3 semanas :(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Boa noite,

julgo que poderá ser feito de várias formas, incluindo por regular expressions.

No entanto, deixo um exemplo a funcionar:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        enum TipoLinha
        {
            NaoDefinido=0,
            Separador=1,
            Nome=2,
            Percentagem=3
        }

        static void Main(string[] args)
        {
            var ultimoTipoLinha = TipoLinha.NaoDefinido;
            string conteudo="";

            //
            foreach(string linha in File.ReadAllLines("texto.txt"))
            {
                if (linha.Trim().Length > 0)
                {
                    switch (ultimoTipoLinha)
                    {
                        case TipoLinha.NaoDefinido:
                        case TipoLinha.Percentagem:
                            if (linha.StartsWith("-"))
                            {
                                ultimoTipoLinha = TipoLinha.Separador;
                                Console.WriteLine(linha);
                            }
                            break;

                        case TipoLinha.Separador:
                            conteudo = linha;
                            ultimoTipoLinha = TipoLinha.Nome;
                            break;

                        case TipoLinha.Nome:
                            Console.WriteLine($"\"{conteudo} {linha}\"");
                            ultimoTipoLinha = TipoLinha.Percentagem;
                            break;
                    }
                }
            }
        }
    }
}

Este exemplo assume que tens um ficheiro com o nome "texto.txt" na pasta onde é executado e que o conteúdo está de acordo com o exemplo (tendo ou não linhas a vazio)

O output está para a consola, mas caso necessário é enviares para outro ficheiro.

G3nSuWE.png

Espero que ajude

Editado por nelsonr
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nelsonr

Boas,

pelos vistos o ficheiro nem sempre tem cada elemento separado entre as barras.
Fiz uma alteração para funcionar dessa forma:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            string nome="";
            bool definiuNome = false;
            //
            foreach(string linha in File.ReadAllLines("texto.txt"))
            {
                if (linha.Length>2)
                {
                    if (linha.StartsWith("-"))
                    {
                        Console.WriteLine(linha);
                        definiuNome = false;
                    }
                    else
                    {
                        if(!definiuNome)
                        {
                            definiuNome = true;
                            nome = linha;
                        }
                        else
                        {
                            definiuNome = false;
                            Console.WriteLine($"\"{nome} {linha}\"");
                        }
                    }
                }
            }
        }
    }
}

Pelos testes parece ok:

RNOcGdz.png

O conteúdo de teste que usei foi o indicado por mensagem privada, que contém tabs no fim de algumas linhas. 
Por isso aparece aquele espaço depois das percentagens.

Caso seja necessário remover, é usar o linha.Replace("\t", "") no output, em vez do linha.

Espero que ajude

Editado por nelsonr
  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Drak_PT

Como sempre o teu trabalho e exelente está tudo a trabalhar a 100%.

Muito obrigado amigo, como disse anteriormente tens um grande coração e um grande espírito de entre ajuda, que surja mais pessoas como tu no futuro.

Cordial abraço a todos os envolvidos.

No que poder ajudar ca estarei também apesar de ser um noob. :(

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.