Jump to content

[RESOLVIDO] Comparar Conteudos


SLIFE
 Share

Recommended Posts

Boas Pessoal

Primeiro que tudo um Feliz Natal.

Gostaria de saber se alguem me pode ajudar com um pequeno problema que estou a ter.

Precisava de comparar o conteudo de dois ficheiros de texto.

E escrever num terceiro, o conteudo diferente.

Tentado explicar melhor:

Tenho uma aplicação que ao iniciar, vai a uma determinada pasta e verifica todos os nomes de ficheiros lá encontrados.

Coloca todos esses nomes dentro de uma listbox.

E grava um ficheiro texto com esses nomes.

Depois quando eu clico na listbox e seleciono um desses ficheiros, o programa grava-me noutro ficheiro de texto o nome.

Isto é: Cria dois ficheiros txt.

Eu agora precisava era de comparar o conteudo desses dois ficheiros e gravar num terceiro os nomes que fossem diferentes.

Exemplo pratico:

Ficheiro 1:

Ana Rita

Pedro Santos

Rosa Maria

Ficheiro Dois:

Ana Rita

Entao no terceiro ficheiro iria apenas aparecer:

Pedro Santos

Rosa Maria

Não se me consegui fazer entender.

Se alguem me poder ajudar agradecia.

Estou preso aqui...

Desde já obrigado

SLIFE

Sandro Coelho

Link to comment
Share on other sites

Boas

O codigo que eu tenho é isto:

Será que alguem me pode ajudar como comprar os dois ficheiros e retirar a informação que preciso:


     Dim ficheirologExiste As Boolean

        ficheirologExiste = My.Computer.FileSystem.FileExists(My.Application.Info.DirectoryPath & "\Ficheiro1.txt")

        If ficheirologExiste = False Then
            My.Computer.FileSystem.WriteAllText(My.Application.Info.DirectoryPath & "\Ficheiro1.txt", String.Empty, False)

        End If



        Dim blnLerDados As Boolean = False

        'Cria um array, colocando o conteúdo de cada linha em indexs diferentes
        Dim Linha() As String = Strings.Split(My.Computer.FileSystem.ReadAllText(My.Application.Info.DirectoryPath & "\Ficheiro1.txt", System.Text.Encoding.Default), ControlChars.CrLf)
        'Verifica linha a linha
        For i As Integer = 0 To Linha.Length - 1
            'Se não estiver vazia...
            If Linha(i) <> "" Then


                'Lê o Conteúdo
                If (blnLerDados = True) And Not (Linha(i) = nomes) Then
                    Texto = Texto & " " & Linha(i)
                End If

                'Verifica o conteúdo
                If (Linha(i) = nomes) Then
                    blnLerDados = True
                    Texto = Linha(i)

                   

                    Exit Sub



                
                End If
            End If

        Next

Agradecia uma ajuda.

Sandro Coelho

Link to comment
Share on other sites

Não te apresses em fazer logo a comparação na leitura dos ficheiros.

Quando se trata de leitura de ficheiros pequenos, sempre achei melhor carregar tudo para "memória" e trabalhar o abstracto.

Procura primeiro carregar os ficheiros para memória e a comparação acaba por ser muito mais fácil.

Ainda assim, aqui tens uma solução:

Public Class Form1

    Private Lista1 As New List(Of String)
    Private Lista2 As New List(Of String)
    Private ListaDiff As new List(Of String)

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        LerFicheiros()
        CompararListas()
        EscreverDiff()
    End Sub

    Private Sub EscreverDiff()
        Dim SW As New IO.StreamWriter("c:\diff.txt", False, System.Text.Encoding.Default)
        For Each LDI As String In ListaDiff
            SW.WriteLine(LDI)
        Next
        SW.Close()
    End Sub

    Private Sub CompararListas()

        Dim L1 As List(Of String) = Nothing
        Dim L2 As List(Of String) = Nothing

        If Lista1.Count > Lista2.Count Then L1 = Lista1 : L2 = Lista2 Else L1 = Lista2 : L2 = Lista1

        Dim NomeEncontrado As Boolean = False

        For Each L1I As String In L1
            For Each L2I As String In L2
                If LCase(L1I.Trim) = LCase(L2I.Trim) Then NomeEncontrado = True
            Next
            If NomeEncontrado = False Then ListaDiff.Add(L1I) Else NomeEncontrado = False
        Next
    End Sub

    Private Sub LerFicheiros()
        Dim SR As New IO.StreamReader("c:\file1.txt", System.Text.Encoding.Default)
        While Not SR.EndOfStream
            Lista2.Add(SR.ReadLine)
        End While
        SR.Close()

        SR = New IO.StreamReader("c:\file2.txt", System.Text.Encoding.Default)
        While Not SR.EndOfStream
            Lista1.Add(SR.ReadLine)
        End While
        SR.Close()
    End Sub
End Class

Aí tens carregamento, comparação segura e escrita 😕

Não hesites, aliás, nunca hesites em perguntar o porquê das coisas. Qualquer dúvida, apita.

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other sites

Não te apresses em fazer logo a comparação na leitura dos ficheiros.

Quando se trata de leitura de ficheiros pequenos, sempre achei melhor carregar tudo para "memória" e trabalhar o abstracto.

Procura primeiro carregar os ficheiros para memória e a comparação acaba por ser muito mais fácil.

Ainda assim, aqui tens uma solução:

Aí tens carregamento, comparação segura e escrita B)

Não hesites, aliás, nunca hesites em perguntar o porquê das coisas. Qualquer dúvida, apita.

Boas

Funciona em pleno.

Agora so precisava de saber como faço para limpar o que fica na memoria.

Pois coloquei o teu codigo do load, num botao, mas sempre que carrego neste, ele verifica os ficheiros e escreve os diferentes, mas tambem escreve o que esta na memoria!

(Sempre que carrego mais que uma vez no botao)

Como faço no teu codigo para isso nao acontecer.

Já tentei fazer o listadiff.clear()

Mas nao funciona.

Cpts

SLIFE

Sandro Coelho

Link to comment
Share on other sites

Basta limpar, não só a ListaDiff mas também a Lista1 e Lista2 que é para onde são carregados os dados base.

Boas ribeiro

Vou experimentar.

Estive a olhar para o codigo, e nem me estava a passar pela cabeça tal coisa (lista1 e lista2) :wallbash:  :wallbash:

Vou testar isso, e se funcionar direito, digo alguma coisa.

E encerro o topico.

Obrigado

Cpts

SLIFE

Sandro Coelho

Link to comment
Share on other sites

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
 Share

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