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:
¿ Y la estructura de los datos ? asi dificil
Buscar en una Carpeta pero no en subacaretas:
Tambien con Like mas la funcion Dir() puedes buscar no recuerdo bien je.
Buscar en un director X y tambien en subcarpetas
' 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
'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
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ó.
Cita de: ░▒▓BlackZeroҖ▓▒░ en 10 Agosto 2008, 00:10 AM
Buscar en una Carpeta pero no en subacaretas:
Tambien con Like mas la funcion Dir() puedes buscar no recuerdo bien je.
Buscar en un director X y tambien en subcarpetas
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..
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
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 +