none
Comparar 2 textos usando Split RRS feed

  • Pergunta

  • Estou com o seguinte problema: Tenoh dos arquivos de textos com frases separadas por "|" e preciso compara-los separando a frase antes do "|" e se essa frase for igual a do outro arquivo, quero pegar a frase depois do "|" do segundo arquivo e coloca-la depois do "|" do primeiro arquivo.

    Tentei usando split para separar as frases pelo "|" que existe apenas uma vez em cada frase mas me enrolei na hora de compara as frase antes "|" do primeiro arquivos com a frase do segundo e grava a frase inteira do segundo arquivo em que a frase antes do "|" for igual a do primeiro.

    segunda-feira, 5 de janeiro de 2015 19:16

Respostas

  • Veja que seu código não esta igual ao meu, no ultimo exemplo estou lendo cada linha do arquivo e você postou acima lendo todo o texto é diferente, teste o meu exemplo, copie e cole e teste, se você quer ler dois arquivos faça a leitura encadeada:

    using System;
    using System.IO;
    using System.Windows.Forms;
    
    namespace ComparandoTextos
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                StreamReader streamReader = new StreamReader(@"d:\teste1.txt");
                StreamReader streamReader2 = new StreamReader(@"d:\teste2.txt");
    
    
                //Para ler cada linha do arquivo
                string linhaLida, linhaLida2 = string.Empty;
                string[] frase1 = null;
                string[] frase2 = null;
                string novaFrase = null;
    
                //Vai ler linha a linha do seu arquivo
                while ((linhaLida = streamReader.ReadLine()) != null)
                {
                    while ((linhaLida2 = streamReader2.ReadLine()) != null)
                    {
                        frase1 = linhaLida.Split('|');
                        frase2 = linhaLida2.Split('|');
    
                        if (frase1[0] == frase2[0])
                        {
                            novaFrase = frase1[0] + " " + frase2[1];
                        }
                    }
                }
                MessageBox.Show(novaFrase);
            }
        }
    }
    


    Segue codigo completo e funcional


    quinta-feira, 8 de janeiro de 2015 00:21
  • Qual seu nível de conhecimento?, sabe mexer com laços de repetição contadores etc?

    Sabendo mexer com laço de repetição basta você criar um índice para frase2[0] e ir incrementando para testar todas as frases (não sei para qual finalidade), que ficara assim:

        //Vai ler linha a linha do seu arquivo
                while ((linhaLida = streamReader.ReadLine()) != null)
                {
                    for (int i=0;(linhaLida2 = streamReader2.ReadLine()) != null);i++)
                    {
                        frase1 = linhaLida.Split('|');
                        frase2 = linhaLida2.Split('|');
    
                        if (frase1[0] == frase2[i])
                        {
                            novaFrase = frase1[0] + " " + frase2[i];
                        }
                    }
                }
                MessageBox.Show(novaFrase);
            }
        }
    }

    O resto deixo com você Adapte o código!

    quinta-feira, 8 de janeiro de 2015 09:29

Todas as Respostas

  • Faz dessa maneira:

    string frase1 = "Separando textos|Utilizando C#";
    string frase2 = "Facil de utilizar|Utilizando C#";
    string[] conFrase1 = frase1.Split('|');
    string[] conFrase2 = frase2.Split('|');
    
    foreach(string frase in conFrase1)
    {
      foreach(string frase2 in conFrase2)
      {
        if(frase1==frase2) 
         {
             string novaFrase = frase1+ " "+conFrase2;
         }
       }
    }
    
    

    Isso é só um exemplo funcional mais você pode tirar o foreach e comparar o vetor apenas com if:
    string frase1 = "Separando textos|Utilizando C#";
    string frase2 = "Facil de utilizar|Utilizando C#";
    string[] conFrase1 = frase1.Split('|');
    string[] conFrase2 = frase2.Split('|');
    
    foreach(string frase in conFrase1)
    {
        if(frase==conFrase2[0]) 
         {
             string novaFrase = frase+ " "+conFrase2[0];
         }
       
    }
    Faz o que melhor lhe facilitar
    segunda-feira, 5 de janeiro de 2015 19:32
  • Bom dia Rhadamants,

    Vou marcar como resposta o do MRGMSOFT, pois está correto, só verifica se serve para o seu caso, caso não resolva por favor desmarque que iremos continuar te ajudando ok?

    Abraço


    Ricardo Cortes Microsoft Contingent Staff

    Esse contedo e fornecido sem garantias de qualquer tipo, seja expressa ou implicita.

    MSDN Community Support

    terça-feira, 6 de janeiro de 2015 13:55
    Moderador
  • Quando chega em casa, vou fazer as mudanças para ler 2 arquivos e testar a solução.
    terça-feira, 6 de janeiro de 2015 15:11
  • ok, ficamos no aguardo.

    Abraço


    Ricardo Cortes Microsoft Contingent Staff

    Esse contedo e fornecido sem garantias de qualquer tipo, seja expressa ou implicita.

    MSDN Community Support

    terça-feira, 6 de janeiro de 2015 15:29
    Moderador
  • Não serviu para o que estou tentando fazer.

    Seria algo assim:

    string frase1 = "Utilizando C#|Separando textos";
    string frase2 = "Utilizando C#|Facil de utilizar";

    Dividindo as frases pelo "|". Se o que está antes do "|" for igual nas duas frases, substituir o que está depois do "|" da primeira pelo que vem depois do "|" da segunda frase. Mas fazendo isso lendo um arquivo de texto.

    Ficando assim:

    string frase1 = "Utilizando C#|Facil de utilizar";

    Porque quando o que está antes do "|" não for igual, pular a frase.

    De forma simples, seria comparar os conFrase[0] e se forem iguais copiar a frase2 para a frase1.

    terça-feira, 6 de janeiro de 2015 18:29
  • É exatamente o que faz o código que postei, te dei duas opções reveja o segundo exemplo, vou comentar para você ver:

    string frase1 = "Utilizando C#|Separando textos";
    string frase2 = "Utilizando C#|Facil de utilizar";
    
    //Separo as frases com split em cada vetor
    string[] conFrase1 = frase1.Split('|');
    string[] conFrase2 = frase2.Split('|');
    
    //Aqui eu pego as frases no vetor
    foreach(string frase in conFrase1)
    {
    //pego a frase lida e comparo com o primeiro elemento da frase 2 e se for igual crio uma outra frase com o elemento 2
        if(frase==conFrase2[0]) 
         {
             string novaFrase = frase+ " "+conFrase2[1];
         }
       MessageBox.Show(novaFrase);
    }
    Claro que você vai adaptar ao que precisa o código esta ai

    • Sugerido como Resposta Mr. GMSOFT terça-feira, 6 de janeiro de 2015 18:38
    terça-feira, 6 de janeiro de 2015 18:35
  • Estou usando assim
    StreamReader streamReader = new StreamReader(@"d:\teste1.txt");
            string frase1 = streamReader.ReadToEnd();

    mas não esta lendo frase a frase. os conFrase estão ficando com todo o texto e não uma frase por vez.
    terça-feira, 6 de janeiro de 2015 19:03
  • Se a frase estive linha a linha você deve ler dessa maneira
    StreamReader streamReader = new StreamReader(@"d:\teste1.txt");
    
    
    //Para ler cada linha do arquivo
    string linhaLida = string.Empty;
    
    //Vai ler linha a linha do seu arquivo
    while((linhaLida=streamReader.ReadLine())!=null)
    {
            //Seu codigo aqui
    }

    Suas frases tem esses separadores "|" como você mencionou ou você que vai adicionar ao ler do arquivo?


    • Editado Mr. GMSOFT terça-feira, 6 de janeiro de 2015 20:32
    terça-feira, 6 de janeiro de 2015 20:32
  • As frases já possuem o "|".

    então é só eu adicionar isso no //Seu codigo aqui?

     if(frase==conFrase2[0]) 
         {
             string novaFrase = frase+ " "+conFrase2[1];
         }

    terça-feira, 6 de janeiro de 2015 20:50
  • Ficaria assim, supondo que você vai ter uma frase pronta para fazer a comparação, se for do mesmo arquivo tem que pegar a próxima linha para comprara:

    StreamReader streamReader = new StreamReader(@"d:\teste1.txt");
    
    
    //Para ler cada linha do arquivo
    string linhaLida = string.Empty;
    string[] frase1 =null;
    string[] frase2 =null;
    string frase="Mamao com açucar|Utilizando C#";
    
    //Vai ler linha a linha do seu arquivo
    while((linhaLida=streamReader.ReadLine())!=null)
    {
            frase1 = linhaLida.Split('|');
            frase2 = frase.Split('|');
    
            if(frase1[0]==frase2[0]) 
         {
             string novaFrase = frase1[0]+ " "+Frase2[1];
         }
    }

    • Sugerido como Resposta Mr. GMSOFT quarta-feira, 7 de janeiro de 2015 12:33
    quarta-feira, 7 de janeiro de 2015 12:33
  • Estou usando assim, cada arquivo tem a frase que quero comparar. Comparando o teste1 com teste2 e criar um teste3 com as frase que forem iguais aos do teste2 e manter as que não forem do teste1.

    StreamReader streamReader = new StreamReader(@"d:\teste1.txt");
            string frase1 = streamReader.ReadToEnd();
            StreamReader streamReader2 = new StreamReader(@"d:\teste2.txt");
            string frase2 = streamReader2.ReadToEnd();

    Testei seu ultimo código e o mesmo da problema em:

     string novaFrase = frase1[0]+ " "+Frase2[1];

    quarta-feira, 7 de janeiro de 2015 23:29
  • Veja que seu código não esta igual ao meu, no ultimo exemplo estou lendo cada linha do arquivo e você postou acima lendo todo o texto é diferente, teste o meu exemplo, copie e cole e teste, se você quer ler dois arquivos faça a leitura encadeada:

    using System;
    using System.IO;
    using System.Windows.Forms;
    
    namespace ComparandoTextos
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                StreamReader streamReader = new StreamReader(@"d:\teste1.txt");
                StreamReader streamReader2 = new StreamReader(@"d:\teste2.txt");
    
    
                //Para ler cada linha do arquivo
                string linhaLida, linhaLida2 = string.Empty;
                string[] frase1 = null;
                string[] frase2 = null;
                string novaFrase = null;
    
                //Vai ler linha a linha do seu arquivo
                while ((linhaLida = streamReader.ReadLine()) != null)
                {
                    while ((linhaLida2 = streamReader2.ReadLine()) != null)
                    {
                        frase1 = linhaLida.Split('|');
                        frase2 = linhaLida2.Split('|');
    
                        if (frase1[0] == frase2[0])
                        {
                            novaFrase = frase1[0] + " " + frase2[1];
                        }
                    }
                }
                MessageBox.Show(novaFrase);
            }
        }
    }
    


    Segue codigo completo e funcional


    quinta-feira, 8 de janeiro de 2015 00:21
  • Funcionou, mas agora estou com seguinte problema: as frases não estão alinhadas e também frases que teste2 não possui. Precisaria ler todo o teste2 e procurar frase1[0]  no teste2 e se encontrar efetuar
    novaFrase = frase1[0] + " " + frase2[1];
    Seu código funcionou mas parece comparar frase a frase e se frases iguais estiverem em posições diferentes ele não faz nada e a variável novaFrase fica vazia.
    quinta-feira, 8 de janeiro de 2015 01:00
  • Qual seu nível de conhecimento?, sabe mexer com laços de repetição contadores etc?

    Sabendo mexer com laço de repetição basta você criar um índice para frase2[0] e ir incrementando para testar todas as frases (não sei para qual finalidade), que ficara assim:

        //Vai ler linha a linha do seu arquivo
                while ((linhaLida = streamReader.ReadLine()) != null)
                {
                    for (int i=0;(linhaLida2 = streamReader2.ReadLine()) != null);i++)
                    {
                        frase1 = linhaLida.Split('|');
                        frase2 = linhaLida2.Split('|');
    
                        if (frase1[0] == frase2[i])
                        {
                            novaFrase = frase1[0] + " " + frase2[i];
                        }
                    }
                }
                MessageBox.Show(novaFrase);
            }
        }
    }

    O resto deixo com você Adapte o código!

    quinta-feira, 8 de janeiro de 2015 09:29
  • Sou bem cru, ainda sou iniciante. O objetivo desse programa é transferir as frases de um texto pra outro. Estou como um projeto no serviço e preciso copiar frases entre os dois arquivos. Um arquivo, no caso teste1 seria o principal e o teste2 teria frases para passar para o teste1, frases que tenham o frase[0] iguais e assim copiar o frase2[1] para o frase1[1] e assim deixar a frase1 igual a frase2 se o frase2[0] for igual a frase1[0]. O trabalho total deve da umas 3 mil frases para conferir e queria evitar a fadiga de fazer manualmente.

    Seu ultimo código tinha um ) errado, que consertei mas ae deu erro em frase2[i] e não conseguir conserta. Esse erro deixa a novafrase com valor null.

    sexta-feira, 9 de janeiro de 2015 20:06
  • Da um print na tela onde ocorre o erro, e posta aqui que eu olho
    sexta-feira, 9 de janeiro de 2015 20:13
  • http://oi60.tinypic.com/6hi8ti.jpg

    TA ae o print.
    • Editado Rhadamants domingo, 11 de janeiro de 2015 16:37
    sexta-feira, 9 de janeiro de 2015 23:22