Ayuda para una funcion de busqueda

Iniciado por Dj Quake, 7 Agosto 2008, 14:37 PM

0 Miembros y 1 Visitante están viendo este tema.

Dj Quake

Buenas Buenas,

Pues saludos primero que nada, voy al punto directamente:

Estoy desarrollando una aplicacion que compara dos archivos '.csv' el problema es que no tengo demasiados conocimientos en Vb, y necesito una mano que de verdad me ayude  :-\ ... Por el momento (lo que se me ha ocurrido) es que el programa abra los dos .csv en dos Richtextbox por separado para luego compararlos y sacar al final lo que se va a eliminar, modificar o añadir (Eliminar una referencia de un producto que ya no existe, o añadir uno nuevo, o sea, modificar el precio de este porque asi se debe pues). La cuestion es que para eso tengo los archivos base1.csv (que seria mi base) y base2.csv ( la base de actualizacion) de ahi crearia tres archivos mas -> a Suprimir.csv , a Añadir.csv y a Modificar.csv (esto ultimo sé como hacerlo) y para eso necesito que el programa busque esas referencias inexistentes, precios diferentes o nuevo producto de la base 2 que aun estan/no estan/o hay que modificar en la 1 y ponerlo en tres RichTextBox diferentes para sacarlo en esos tres archivos... A mi se me hace que es bastante simple, y por lo tanto hace ya unos 4 dias que busco eh! En Francés (porque vivo en Francia y bueno hablo francés), En Español (porque no soy un Francés sino un Venezolano jajaja) y en Inglés (porque lo entiendo bien)... Bueno en fin, solo pido ayuda por favor , si alguien sabe resolver esto se lo agradezco por adelantado!
!
PD: Se me ocurrio usar vbtextcompare pero no sé como utilizarlo muy bien  :( :huh: :huh:

thejuanker

¿ Y  la estructura de los datos ? asi dificil

BlackZeroX

#2
Buscar en una Carpeta pero no en subacaretas:

Código (vb) [Seleccionar]

Tambien con Like mas la funcion Dir() puedes buscar no recuerdo bien je.


Buscar en un director X y tambien en subcarpetas
Código (vb) [Seleccionar]

'   Variable que utilizare para cancelar la busqueda de los archivos
Public Cancelar As Boolean

'   Para las busquedas de todos los archivos
Dim Spli, Count, Total  '   Lo que se Busca, Cuantos, Total de los archivos encontrados
Dim Cant()              '   Cantidad de cada archivo encontrado (en ste caso lo que sea parcial o extensiones)

Public Sub Buscar1(Formulario As Object, Directorio As String, A_buscar As String, Optional No_Directorios As String)
    Dim i, ass
    i = 0
    Spli = Split(A_buscar, ",")
    On Error GoTo Ok:
    For i = 0 To 101
        ass = Spli(i)
        Count = i
    Next i
Ok:
    ReDim Cant(0 To Count)
    Formulario.Label1(1).Caption = ""
    Total = 0
    For i = 0 To Count
        'Cant(i) = Spli(i)
        Cant(i) = 0
        Formulario.Label1(1).Caption = frm_main.Label1(1).Caption & Spli(i) & ": " & Cant(i) & " "
        Total = Total + Cant(i)
    Next
    frm_main.Label1(1).Caption = frm_main.Label1(1).Caption & " |" & Total & " Encontrados"
    Archivos (Directorio)
End Sub
Public Sub Archivos(Directorio As String)
    Dim FSO, F, sf, F1
    Set FSO = CreateObject("Scripting.FileSystemObject")    '   Creo el objeto
    Set F = FSO.getfolder(Directorio)                       '   Obtenemos el directorio plano
    Set sf = F.SubFolders                                   '   Obtenemos los subfolders del directorio plano actual
    'SubDirectorios (Directorio)                            '   obtenemos los archivos del directorio a scanear

    '   Apartir de aqui se empiesan a explorar todos los SubDirectorios (SubCarpetas)
    On Error Resume Next
    For Each F1 In sf
        DoEvents
        frm_dat.lbl_ruta(0).Caption = F1.Path
If Cancelar = True Then Exit Sub                            '   Codigo para cancelar la busqueda de archivos y todo en general
        SubDirectorios (F1.Path)                            '   Obtengo el SubDirectorio y lo cambio
If Cancelar = True Then Exit Sub                            '   Codigo para cancelar la busqueda de archivos y todo en general
        Archivos (F1.Path)                                  '   Obtengo los archivos del subDirectorio actual
If Cancelar = True Then Exit Sub                            '   Codigo para cancelar la busqueda de archivos y todo en general
    Next
    '   Fin
End Sub
Public Sub SubDirectorios(Directorio As String)
    Dim FSO, F, sf, F1, ext, i, a
    i = 0
    Set FSO = CreateObject("Scripting.FileSystemObject")    '   Creo el objeto
    Set F = FSO.getfolder(Directorio)                       '   Obtengo el directorio Plano
    Set sf = F.Files                                        '   Obtengo TODOS los archivos del directorio plano sin ecepción
    '   Apartir de aquí obtengo Todos los archivos sin ecepción
    On Error Resume Next
    For Each F1 In sf
        ext = FSO.GetExtensionName(F1.Path)
If Cancelar = True Then Exit Sub                            '   Codigo para cancelar la busqueda de archivos y todo en general
        For i = 0 To Count
            If Spli(i) = ext Then
                Total = Total + 1
                Set NodX = frm_main.List.ListItems.Add(, , F1.Name) '   Visualiso los archivos en el formulario
                NodX.Tag = F1.Path                                  '   Visualiso los archivos en el formulario
                Cant(i) = Cant(i) + 1
                frm_main.Label1(1).Caption = ""
                For a = 0 To Count
                    frm_main.Label1(1).Caption = frm_main.Label1(1).Caption & Spli(a) & ": " & Cant(a) & " "
                Next a
                frm_main.Label1(1).Caption = frm_main.Label1(1).Caption & " |" & Total & " Encontrados"
            End If
        Next i
    Next
    'fin
End Sub


Si no te satisfacen estos ejemplos con objectos aca uno por via Api sacado de la WinApi

Código (vb) [Seleccionar]

'Create a form with a command button (command1), a list box (list1)
'and four text boxes (text1, text2, text3 and text4).
'Type in the first textbox a startingpath like c:\
'and in the second textbox you put a pattern like *.* or *.txt

Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long
Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long
Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long

Const MAX_PATH = 260
Const MAXDWORD = &HFFFF
Const INVALID_HANDLE_VALUE = -1
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_DIRECTORY = &H10
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_ATTRIBUTE_TEMPORARY = &H100

Private Type FILETIME
    dwLowDateTime As Long
    dwHighDateTime As Long
End Type

Private Type WIN32_FIND_DATA
    dwFileAttributes As Long
    ftCreationTime As FILETIME
    ftLastAccessTime As FILETIME
    ftLastWriteTime As FILETIME
    nFileSizeHigh As Long
    nFileSizeLow As Long
    dwReserved0 As Long
    dwReserved1 As Long
    cFileName As String * MAX_PATH
    cAlternate As String * 14
End Type
Function StripNulls(OriginalStr As String) As String
    If (InStr(OriginalStr, Chr(0)) > 0) Then
        OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
    End If
    StripNulls = OriginalStr
End Function

Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, DirCount As Integer)
    'KPD-Team 1999
    'E-Mail: KPDTeam@Allapi.net
    'URL: http://www.allapi.net/

    Dim FileName As String ' Walking filename variable...
    Dim DirName As String ' SubDirectory Name
    Dim dirNames() As String ' Buffer for directory name entries
    Dim nDir As Integer ' Number of directories in this path
    Dim i As Integer ' For-loop counter...
    Dim hSearch As Long ' Search Handle
    Dim WFD As WIN32_FIND_DATA
    Dim Cont As Integer
    If Right(path, 1) <> "\" Then path = path & "\"
    ' Search for subdirectories.
    nDir = 0
    ReDim dirNames(nDir)
    Cont = True
    hSearch = FindFirstFile(path & "*", WFD) '<------ el * es un comodin y buscara TODO igual busca archivos Zip sustituyendo el * por *.zip y de igual forma lo que sea tu desides ok espefimenta ja
    If hSearch <> INVALID_HANDLE_VALUE Then
        Do While Cont
        DirName = StripNulls(WFD.cFileName)
        ' Ignore the current and encompassing directories.
        If (DirName <> ".") And (DirName <> "..") Then
            ' Check for directory with bitwise comparison.
            If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
                dirNames(nDir) = DirName
                DirCount = DirCount + 1
                nDir = nDir + 1
                ReDim Preserve dirNames(nDir)
            End If
        End If
        Cont = FindNextFile(hSearch, WFD) 'Get next subdirectory.
        Loop
        Cont = FindClose(hSearch)
    End If
    ' Walk through this directory and sum file sizes.
    hSearch = FindFirstFile(path & SearchStr, WFD)
    Cont = True
    If hSearch <> INVALID_HANDLE_VALUE Then
        While Cont
            FileName = StripNulls(WFD.cFileName)
            If (FileName <> ".") And (FileName <> "..") Then
                FindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
                FileCount = FileCount + 1
                List1.AddItem path & FileName
            End If
            Cont = FindNextFile(hSearch, WFD) ' Get next file
        Wend
        Cont = FindClose(hSearch)
    End If
    ' If there are sub-directories...
    If nDir > 0 Then
        ' Recursively walk into them...
        For i = 0 To nDir - 1
            FindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", SearchStr, FileCount, DirCount)
        Next i
    End If
End Function
Sub Command1_Click()
    Dim SearchPath As String, FindStr As String
    Dim FileSize As Long
    Dim NumFiles As Integer, NumDirs As Integer
    Screen.MousePointer = vbHourglass
    List1.Clear
    SearchPath = Text1.Text
    FindStr = Text2.Text
    FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
    Text3.Text = NumFiles & " Files found in " & NumDirs + 1 & " Directories"
    Text4.Text = "Size of files found under " & SearchPath & " = " & Format(FileSize, "#,###,###,##0") & " Bytes"
    Screen.MousePointer = vbDefault
End Sub
The Dark Shadow is my passion.

Dj Quake

Cita de: thejuanker en  9 Agosto 2008, 21:43 PM
¿ Y  la estructura de los datos ? asi dificil


Sorry por durar tanto tiempo sin escribir, para la estructura de datos...

Hay:        Productos internos              y  Productos Externos
Entonces:
1.Si un P.i(referencia) no esta en P.e(referencia) entonces hay que eliminarlo
2. Si viceversa entonces producto nuevo, hay que añadirlo
3. Si en PI no es el mismo precio que PE entonces cambiar precio (PE)

todo esto sale en 3 archivos diferentes (por supuesto .csv)

Entonces la estructura es algo como esto:

Referencia - Producto - Precio

;).. Ya ha pasado un mes y ya resolvi eproblema aunque tomé en cuenta la respuesta de BlackZero que por cierto si me ayudó.

Dj Quake

#4
Cita de: ░▒▓BlackZeroҖ▓▒░ en 10 Agosto 2008, 00:10 AM
Buscar en una Carpeta pero no en subacaretas:

Código (vb) [Seleccionar]

Tambien con Like mas la funcion Dir() puedes buscar no recuerdo bien je.


Buscar en un director X y tambien en subcarpetas
Código (vb) [Seleccionar]




Muchas gracias por tu respuesta aun si no era de busquedas de archivo ;), el trabajo esta resuelto y hé aqui la soluciôn para que todos sepan como quedo el proyecto..

Código (vb) [Seleccionar]

Private Sub CompareLists()

        ModifiedList.Clear() 'Esto es en memoria (Arraylist)
        DeleteList.Clear() 'lo mismo
        AddList.Clear() 'lo mismo

        Dim found As Boolean

        'Celà pour Modifier ou Ajouter des items sur les listes correspondants (para modificar o añadir nuevos precios o productos)

        For i As Integer = 0 To ExternalProducts.Count - 1
            found = False

            For j As Integer = 0 To InternalProducts.Count - 1
                If (InternalProducts(j).Reference) = (ExternalProducts(i).Reference) And (InternalProducts(j).Price <> ExternalProducts(i).Price) Then
                    found = True
                    ModifiedList.Add(ExternalProducts(i))
                    Exit For
                Else
                    If InternalProducts(j).Reference = ExternalProducts(i).Reference Then
                        found = True
                        Exit For
                    End If
                End If
            Next j

            If found = False Then
                AddList.Add(ExternalProducts(i))
            End If
        Next i

        For i As Integer = 0 To InternalProducts.Count - 1
            found = False

            'La liste de Suppression (lista de los que hay que eliminar)

            For j As Integer = 0 To ExternalProducts.Count - 1
                If ExternalProducts(j).Reference = InternalProducts(i).Reference Then
                    found = True
                    Exit For
                End If
            Next j

            If found = False Then
                DeleteList.Add(InternalProducts(i))
            End If
        Next i

        Sauve_Fichier() ' la funcion que salva el archivo que quedo hecha con Flujos (Streams)
End sub

Código (vb) [Seleccionar]

Public Class Elform1
    Private InternalProducts As ArrayList = New ArrayList
    Private ExternalProducts As ArrayList = New ArrayList

    Private ModifiedList As ArrayList = New ArrayList
    Private DeleteList As ArrayList = New ArrayList
    Private AddList As ArrayList = New ArrayList


'sorry esto iba al principio  :xD

Y claro todo en VB. Net  ;)...
Saludos!
A +