Jump to content

Formatação de texto


Go to solution Solved by nelsonr,

Recommended Posts

Posted

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

Posted

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.

  • Vote 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.

Posted (edited)
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.

Edited by Drak_PT
Posted
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. 🙂

  • Vote 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.

Posted
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);
            }
        }
    }
}
Posted
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

  • Vote 1
Posted (edited)
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. 😞

Edited by Drak_PT
Posted (edited)
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

Edited by Ricardo Voigt
Outra coisa...
  • Vote 1
Posted (edited)
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.

Edited by Drak_PT
Posted
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

  • Vote 1
Posted

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%

Posted

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.

  • Vote 1

Pedro Martins

Sharing is Knowledge!

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

Posted
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 😞

Posted

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

  • Vote 1
  • Solution
Posted (edited)

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

Edited by nelsonr
  • Vote 1
Posted

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. 😞

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.