Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - elqueteconte

#21
Chamo de pana que tu comes .net....

Q arrech.... Tu codigo....

Tengo varias preguntas:
1.- Al momento de crear el módulo me da error con las variables RegexOptions y Regex; el compilador me indica que no están definidas.

2.- Como lo acoplo esa función en el script que hemos venido trabajando?
Aqui hago el llamado al merge de los archivos:
Código (vbnet) [Seleccionar]

' Merge text files.
        DateUtil.FindAndMergeFiles(Me.fdg.SelectedPath)


Luego de hacer l merge pregunto por el valor del combobox
Código (vbnet) [Seleccionar]

'El usuario selecciono la opcion para cambiar texto
If ComboBox1.SelectedIndex = 0 Then
          ReplaceText("GL.txt","TXT01","TXT1")
          ReplaceText("GL.txt","TXT02","TXT1")
          ReplaceText("IMP6000.txt","TXT01","TXT1")
          ReplaceText("IMP6000.txt","TXT02","TXT1")
Else         
         return
End If


3.- La función ReplaceText (ya la puse en ingles jejejejejeje)
Código (vbnet) [Seleccionar]

    Private Sub ReplaceText(ByVal txtfile As String,
                               ByVal txtfind As String, ByVal txtreplace As String,
                               ByVal comparisonType As StringComparison)
         If Not File.Exists(txtfile) Then
            Throw New FileNotFoundException(message:="File not found", fileName:=txtfile)
         Else
            Dim txt As String = File.ReadAllText(txtfile, Encoding.Default).
                                     Replace(txtfind, txtreplace, comparisonType)
             File.WriteAllText(txtfile, txt, Encoding.Default)
         End If
     End Sub

iria dentro del formulario; correcto?

Mil gracias de nuevo pana.
#22
Saludos a todos;

El siguiente script hace un merge de archivos TXT:
Código (vbnet) [Seleccionar]

  Public Sub FindAndMergeFiles(ByVal sourceDir As String)
       Dim fileNames As String() =
       {
           "CM.txt", "GL.txt",
           "IMP6000.txt", "IMP6001.txt", "IMP6002.txt", "IMP6003.txt"
       }
       Dim curFilename As String = String.Empty
       For Each topDir As DirectoryInfo In New DirectoryInfo(sourceDir).GetDirectories("*", SearchOption.TopDirectoryOnly)
           ' Elimino los archivos principales ("...\topDir\CM.txt", "...\topDir\GL.txt", etc...) de sesiones anteriores.
           For Each txtfile As FileInfo In topDir.GetFiles("*.txt", SearchOption.TopDirectoryOnly)
               If fileNames.Contains(txtfile.Name, StringComparer.OrdinalIgnoreCase) Then
                   txtfile.Delete()
               End If
           Next txtfile
           For Each subDir As DirectoryInfo In topDir.GetDirectories("*", SearchOption.AllDirectories)
               For Each txtfile As FileInfo In subDir.GetFiles("*.txt", SearchOption.AllDirectories)
                   If fileNames.Contains(txtfile.Name, StringComparer.OrdinalIgnoreCase) Then
                       curFilename = fileNames.First(Function(filename) filename.Equals(txtfile.Name, StringComparison.OrdinalIgnoreCase))
                       Using sr As StreamReader = txtfile.OpenText
                           Using sw As New StreamWriter(Path.Combine(topDir.FullName, curFilename), append:=True, encoding:=Encoding.Default, bufferSize:=128)
                               sw.WriteLine(sr.ReadToEnd)
                           End Using ' sw
                       End Using ' sr
                   End If
               Next txtfile
           Next subDir
       Next topDir


Ahora bien en el formulario que usa ese script hay un selector que indica dos opciones A y B; donde si la opción B es la que ha sido seleccionada es nesario buscar en dos archivos particulares una palabra y cambiarla por otra, entiendo que la funcion sería mas o menos así:

Código (vbnet) [Seleccionar]

Private Sub ReemplazaTexto(ByVal Fichero As String, ByVal Texto_Busca As String, ByVal Texto_Reemplaza As String)
   Dim Reader As New StreamReader(Fichero)
   Dim Content As String = Reader.ReadToEnd()
   Reader.Close()
   Content = Regex.Replace(Content, Texto_Busca, Texto_Reemplaza)
   Dim Writer As New StreamWriter(FicheroNuevo)
   Writer.Write(Content)
   writer.Close()
End Sub


Ahora lo que quedaría es que despues que ejecuto el merge es preguntar que opción del combobox está seleccionada, que sería así:
Código (vbnet) [Seleccionar]

'El usuario selecciono la opcion para cambiar texto
If ComboBox1.SelectedIndex = 0 Then
         reemplazatexto("AR.txt","TXTB1","TXTN")
         reemplazatexto("AR.txt","TXTB2","TXTN")
         reemplazatexto("BR.txt","TXTB1","TXTN")
         reemplazatexto("BR.txt","TXTB2","TXTN")
Else          
        return
End If


Creo que así sería; pero si alguien tiene uuna mejor idea será bien recibida.

Desde ya mil gracias.
#23
Liiiisto...!

Hermano eres un duro en .net te felicito....

Mil gracias; ahora me toca ir a otra fase de este proyecto esto es apenas el comienzo, espero poder seguir con tu apoyo.

Dale creare los hilos en el foro que corresponde.

Gracias mil de nuevo mi pana.

Un abrazo y feliz fín de semana.

#24
Cita de: elqueteconte en 19 Octubre 2015, 16:33 PM
Saludos mi pana,

Estoy testeando la función y al principio me estaba dando error pues no hacía el merge de los archivos, entraba en cada carpeta, leia los archivos pero no entraba aqui:

If Not String.IsNullOrEmpty(curFilename) Then

                       Debug.WriteLine(topDir.FullName)
                       Debug.WriteLine(subDir.FullName)
                       Debug.WriteLine(txtfile.FullName)
                       Debug.WriteLine(Path.Combine(topDir.FullName, curFilename))

                       Using sr As StreamReader = txtfile.OpenText
                           File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)
                       End Using

                   End If


El problema era que cuando hacía la comparación de los nombres de los archivos con las constantes:

If txtfile.Name.Equals(NameCM, StringComparison.OrdinalIgnoreCase) Then
                        curFilename = NameCM


La comparación no se daba pues el nombre del archivo es CM.TXT y no CM como estaba definido en las contantes; así que modifiqué esa porción del codigo y voilà funcona la función reune todos los archivos en uno solo.

Así quedó la porción final

        Const NameCM As String = "CM.TXT"
        Const NameGL As String = "GL.TXT"
        Const NameImp60 As String = "IMP6000.TXT"
        Const NameImp61 As String = "IMP6001.TXT"
        Const NameImp62 As String = "IMP6002.TXT"
        Const NameImp63 As String = "IMP6003.TXT"


Pero ahora me está dando este error:
An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

Additional information: The process cannot access the file 'C:\Users\liderapp\Documents\Scripts\Octubre2015\CM.TXT' because it is being used by another process.
Eso sucede justo aqui:

File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)


Cuando ya ha hecho el barrido de todas las carpetas.

Se debe a que el archivo ya está abierto y entonces al intentar abrirlo de nuevo da el error?

Gracias mil por el apoyo mi pana.

Investigando un poco en la nube; me sugieren que use este comando:


                Using loFileStream As System.IO.FileStream = New FileStream(lcFile, FileMode.Create)
                    loStreamWriter = New StreamWriter(loFileStream, cEncoding)
                    loStreamWriter.Write(cString)
                    loStreamWriter.Close()
                End Using


Q opinas al respecto?
Como lo adapto a nuestro script?

Sin mas,

Tu pana agradecido... jejejejejeje
#25
Saludos mi pana,

Estoy testeando la función y al principio me estaba dando error pues no hacía el merge de los archivos, entraba en cada carpeta, leia los archivos pero no entraba aqui:

If Not String.IsNullOrEmpty(curFilename) Then

                       Debug.WriteLine(topDir.FullName)
                       Debug.WriteLine(subDir.FullName)
                       Debug.WriteLine(txtfile.FullName)
                       Debug.WriteLine(Path.Combine(topDir.FullName, curFilename))

                       Using sr As StreamReader = txtfile.OpenText
                           File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)
                       End Using

                   End If


El problema era que cuando hacía la comparación de los nombres de los archivos con las constantes:

If txtfile.Name.Equals(NameCM, StringComparison.OrdinalIgnoreCase) Then
                        curFilename = NameCM


La comparación no se daba pues el nombre del archivo es CM.TXT y no CM como estaba definido en las contantes; así que modifiqué esa porción del codigo y voilà funcona la función reune todos los archivos en uno solo.

Así quedó la porción final

        Const NameCM As String = "CM.TXT"
        Const NameGL As String = "GL.TXT"
        Const NameImp60 As String = "IMP6000.TXT"
        Const NameImp61 As String = "IMP6001.TXT"
        Const NameImp62 As String = "IMP6002.TXT"
        Const NameImp63 As String = "IMP6003.TXT"


Pero ahora me está dando este error:
An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll

Additional information: The process cannot access the file 'C:\Users\liderapp\Documents\Scripts\Octubre2015\CM.TXT' because it is being used by another process.
Eso sucede justo aqui:

File.AppendAllText(Path.Combine(topDir.FullName, curFilename), sr.ReadToEnd, Encoding.Default)


Cuando ya ha hecho el barrido de todas las carpetas.

Se debe a que el archivo ya está abierto y entonces al intentar abrirlo de nuevo da el error?

Gracias mil por el apoyo mi pana.
#26
Dale mi pana.

Gracias mil de nuevo....

#27
Cita de: Eleкtro en 13 Octubre 2015, 18:19 PM
Eso lo puedes solucionar realizando una copia en modo binario:

De todas formas, permíteme una pregunta... si puedes manejarte con VB.Net o con VBS, ¿por qué utilizas Batch?, al menos para merger o fusionar archivos, con lo fácil y "limpio" que es en los lenguajes mencionados no tendrias problemas de ese tipo.

Saludos!

Estoy investigando de como leer las carpetas que se movieron y luego copiar su contenido.
Inicialmente tendría que entrar en carpeta por carpeta para copiar los archivos, claro como el número de carpetas puede variar entonces tendría que manejarlo con un for y luego que entre en cada carpeta hacer el copy la función sería mas o menos así:

Código (vbnet) [Seleccionar]

Private Sub UnirTxt()
       ' Declaro las variables de los archivos TXT
       Dim CM As String() = Directory.GetFiles(dateDir, "CM.txt")
       Dim GL As String() = Directory.GetFiles(dateDir, "GL.txt")
       Dim IMP60 As String() = Directory.GetFiles(dateDir, "IMP6000.txt")
       Dim IMP61 As String() = Directory.GetFiles(dateDir, "IMP6001.txt")
       Dim IMP62 As String() = Directory.GetFiles(dateDir, "IMP6002.txt")
       Dim IMP63 As String() = Directory.GetFiles(dateDir, "IMP6003.txt")

       ' Declaro las carpetas que estan dentro de la carpeta creada
       Dim Folders As New DirectoryInfo(dateDir)

       'Verifico si existen los archivos, en caso de existir los elimino.
       If File.Exists(CM(0)) Then File.Delete(CM(0))
       If File.Exists(GL(0)) Then File.Delete(GL(0))
       If File.Exists(IMP61(0)) Then File.Delete(IMP61(0))
       If File.Exists(IMP62(0)) Then File.Delete(IMP62(0))
       If File.Exists(IMP63(0)) Then File.Delete(IMP63(0))

       Dim swcm As New StreamWriter(CM(0))
       Dim swgl As New StreamWriter(GL(0))
       Dim swi60 As New StreamWriter(IMP60(0))
       Dim swi61 As New StreamWriter(IMP61(0))
       Dim swi62 As New StreamWriter(IMP62(0))
       Dim swi63 As New StreamWriter(IMP63(0))

       'Entro en cada carpeta día
       For Each Folder As DirectoryInfo In Folders.GetDirectories
           ' Tomo el nombre del archivo y hago la copia
           For Each txtfile As FileInfo In Folder.GetFiles
               If Mid(txtfile.Name, 1, 2) = "CM" Then
                   swcm.Write(File.ReadAllText(txtfile.FullName))
               End If
               If Mid(txtfile.Name, 1, 2) = "GL" Then
                   swgl.Write(File.ReadAllText(txtfile.FullName))
               End If
               If Mid(txtfile.Name, 6, 7) = "01" Then
                   swi60.Write(File.ReadAllText(txtfile.FullName))
               End If
               If Mid(txtfile.Name, 6, 7) = "02" Then
                   swi62.Write(File.ReadAllText(txtfile.FullName))
               End If
               If Mid(txtfile.Name, 6, 7) = "03" Then
                   swi63.Write(File.ReadAllText(txtfile.FullName))
               End If
           Next
       Next
       swcm.Close()
       swgl.Close()
       swi60.Close()
       swi61.Close()
       swi62.Close()
       swi63.Close()
End Sub


Que opinas?

Como lo integro con tu código?

Gracias mil de nuevo.
#28
Cita de: Eleкtro en 13 Octubre 2015, 18:19 PM
Eso lo puedes solucionar realizando una copia en modo binario:

De todas formas, permíteme una pregunta... si puedes manejarte con VB.Net o con VBS, ¿por qué utilizas Batch?, al menos para merger o fusionar archivos, con lo fácil y "limpio" que es en los lenguajes mencionados no tendrias problemas de ese tipo.

Saludos!


Saludos Alektro;

Gracias oir tu tiempo.

Yo manejo .bath pues cuando comencé con el proceso de integración, uno de los pasos era el usar este script el cual tenía que editar cada vez que hubiesen mas días por agregar, es por ello que vez en el script como se repite el mismo comando y solo cambia el día, claro cada vez que agregas un día el comando copy se repite 6 veces.

De nuevo quiero expresarte mi agradecimiento por el apoyo.

Ya estoy bajando el Visual Studio Express para ver y estudiar el código.

Sin mas,

elqueteconte
#29
Saludos chicos de nuevo gracias por el apoyo y mil disculpas por la joda;

Les explico paso a paso:
1.- El usuario indica (en numeros) el mes. Es decir que hay que validar que solo coloque dos caracteres y que sean numeros entre 01 y 12.
2.- Verificar si la carpeta mes con el año está creada. Ejemplo: Si el usuario indica 09 entonces la carpeta sería Septiembre2015.
3.- Si la carpeta no existe;se crea la carpeta con el mes y el año, ejemplo Septiembre2015
4.- Buscar en el directorio donde se está ejecutando el bath todas las carpetas cuya estructura sea año, mes, dia corresponda al mes de la carpeta que acabo de crear y mover esas carpetas a la que acabo de crear. Ejemplo
Si cree la carpeta miruta/Septiembre2015 y en miruta/ hay carpetas 20150901, 20150902 ... hasta 20150930 y moverla a  miruta/Septiembre2015
YA TODO ESTO ESTA
5.- Luego de haber movido las carpetas al direcotorio el script entra en la carpeta del día 1 y copia la información sobre otro archivo y sí susesivamente hasta el ultimo día. Esto hará que al final el archivo resultante tendra la información de todos los días.
Yo supongo que el script entra en un for desde el primer día hasta el ultimo y dentro del for estaría la sentencia de comiando.
Sería algo así:
Para dia=1 hasta dia=31
copiar en archivoA plantilla la información del archivoA
copiar en archivoB plantilla la información del archivoB
Fin para

6.- Buscar caracter especial en los archivos CM.txt; GL.txt; IMP6000.txt;IMP6001.txt; IMP6002.txt y IMP6003.txt y eliminarlo.

7.- Cerrar archivos.

Me da pena con ustedes mi pana; pero la programación no es mi fuerte; trabajo en el área de tecgonologia a nivel de administración de recursos pero he adquirido una nueva responsabilidad y pues me toca tirar codigo, pero este script es urgente que lo haga.

Sin mas;

elqueteconte
#30
 ;-) ;-) ;-) ;-) ;-)

Son lo maximo chicos....

Mil gracias, yo tengo un libro de VB.Net me voy a poner a aprender pues este proceso no terminar aquí; hasta ahora han trabajado en el entorno lo que viene es la fusión de los archivos txt que están en cada carpeta.

Miren este archivo .bat

copy /y blancos\*.TXT .

copy CM.txt + C:\carp1\Emp1\20150908\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150908\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150908\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150908\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150908\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150908\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150909\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150909\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150909\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150909\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150909\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150909\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150910\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150910\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150910\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150910\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150910\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150910\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150911\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150911\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150911\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150911\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150911\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150911\IMP6003.txt IMP6003.txt

copy CM.txt + C:\carp1\Emp1\20150912\CM.txt CM.txt
copy GL.txt + C:\carp1\Emp1\20150912\GL.txt GL.txt
copy IMP6000.txt + C:\carp1\Emp1\20150912\IMP6000.txt IMP6000.txt
copy IMP6001.txt + C:\carp1\Emp1\20150912\IMP6001.txt IMP6001.txt
copy IMP6002.txt + C:\carp1\Emp1\20150912\IMP6002.txt IMP6002.txt
copy IMP6003.txt + C:\carp1\Emp1\20150912\IMP6003.txt IMP6003.txt

Fijense que el .bat hace un recorrido por cada carpeta y copia los archivos que estén en esta dentro de otr archivo con el mismo nombre que se encuentra en el nivel superior, es decir, si la carpeta ppal se llama Octubre2015 el proceso hace un recorrido por las carpetas desde la 20151001 hasta 2015610N (donde N es el último día del mes) y crea los archivos a fusionados.

El proceso de fusión de los archivos hace que los mismos contengan dentro un caracter especial que indica el fin de cada archivo, este caracter es como una fecla apuntando a la izquierda; la idea es que despues que el proceso de merge esté completado hay que entrar en cada archivo y limpiarlos.

Sería mucho pedir esto?

De pana que muchisimas gracias chicos, son lo maximo.