Drak_PT Posted August 31, 2018 at 03:03 AM Report #611707 Posted August 31, 2018 at 03:03 AM 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
nunopicado Posted August 31, 2018 at 08:29 AM Report #611708 Posted August 31, 2018 at 08:29 AM 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. 1 Report "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.
Drak_PT Posted August 31, 2018 at 12:28 PM Author Report #611710 Posted August 31, 2018 at 12:28 PM (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 August 31, 2018 at 12:30 PM by Drak_PT
nunopicado Posted August 31, 2018 at 12:29 PM Report #611711 Posted August 31, 2018 at 12:29 PM 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. 🙂 1 Report "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.
Drak_PT Posted September 4, 2018 at 02:06 AM Author Report #611743 Posted September 4, 2018 at 02:06 AM 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); } } } }
Ricardo Voigt Posted September 4, 2018 at 02:02 PM Report #611753 Posted September 4, 2018 at 02:02 PM 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 1 Report
Drak_PT Posted September 4, 2018 at 08:19 PM Author Report #611759 Posted September 4, 2018 at 08:19 PM (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 September 4, 2018 at 09:03 PM by Drak_PT
Ricardo Voigt Posted September 5, 2018 at 12:58 AM Report #611760 Posted September 5, 2018 at 12:58 AM 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 1 Report
Drak_PT Posted September 5, 2018 at 01:33 AM Author Report #611761 Posted September 5, 2018 at 01:33 AM 33 minutos atrás, Ricardo Voigt disse: Ola Quais erros ? Att Ricardo Sempre que tento implementar o código ao código actual fico com erros dos quais ainda nao consegui perceber. https://image.ibb.co/cVG6QK/Sem_T_tulo.png mais uma vez obrigado pela disponibilidade.
Ricardo Voigt Posted September 5, 2018 at 09:11 AM Report #611762 Posted September 5, 2018 at 09:11 AM (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 September 5, 2018 at 09:15 AM by Ricardo Voigt Outra coisa... 1 Report
Drak_PT Posted September 5, 2018 at 01:27 PM Author Report #611767 Posted September 5, 2018 at 01:27 PM Bom mesmo sem erros agora fico apenas com o documento em branco 😞 Obrigado mais uma vez.
Ricardo Voigt Posted September 5, 2018 at 02:05 PM Report #611769 Posted September 5, 2018 at 02:05 PM 28 minutos atrás, Drak_PT disse: Bom mesmo sem erros agora fico apenas com o documento em branco 😞 Obrigado mais uma vez. 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 1 Report
Drak_PT Posted September 5, 2018 at 02:30 PM Author Report #611770 Posted September 5, 2018 at 02:30 PM (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 September 5, 2018 at 05:09 PM by Drak_PT
Ricardo Voigt Posted September 5, 2018 at 05:41 PM Report #611775 Posted September 5, 2018 at 05:41 PM 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 1 Report
Drak_PT Posted September 11, 2018 at 06:52 PM Author Report #611806 Posted September 11, 2018 at 06:52 PM 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%
Rechousa Posted September 11, 2018 at 09:54 PM Report #611809 Posted September 11, 2018 at 09:54 PM 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. 1 Report Pedro Martins Sharing is Knowledge! http://www.linkedin.com/in/rechousa
Drak_PT Posted September 12, 2018 at 07:04 AM Author Report #611810 Posted September 12, 2018 at 07:04 AM 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 😞
nelsonr Posted September 12, 2018 at 08:05 PM Report #611820 Posted September 12, 2018 at 08:05 PM 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. Espero que ajude 1 Report
Solution nelsonr Posted September 12, 2018 at 09:20 PM Solution Report #611822 Posted September 12, 2018 at 09:20 PM (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: 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 September 12, 2018 at 09:22 PM by nelsonr 1 Report
Drak_PT Posted September 12, 2018 at 10:03 PM Author Report #611823 Posted September 12, 2018 at 10:03 PM 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. 😞
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now