SLIFE Posted December 25, 2009 at 08:56 PM Report Share #302400 Posted December 25, 2009 at 08:56 PM 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 More sharing options...
SLIFE Posted December 27, 2009 at 05:50 PM Author Report Share #302622 Posted December 27, 2009 at 05:50 PM 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 More sharing options...
ribeiro55 Posted December 28, 2009 at 10:13 AM Report Share #302716 Posted December 28, 2009 at 10:13 AM 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 More sharing options...
SLIFE Posted December 30, 2009 at 05:23 PM Author Report Share #303247 Posted December 30, 2009 at 05:23 PM 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 More sharing options...
ribeiro55 Posted December 30, 2009 at 08:47 PM Report Share #303294 Posted December 30, 2009 at 08:47 PM Basta limpar, não só a ListaDiff mas também a Lista1 e Lista2 que é para onde são carregados os dados base. 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 More sharing options...
SLIFE Posted December 30, 2009 at 08:59 PM Author Report Share #303301 Posted December 30, 2009 at 08:59 PM 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) 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 More sharing options...
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