• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

SLIFE

[RESOLVIDO] Comparar Conteudos

6 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 :confused:

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link 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