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

#11
Cita de: Eleкtro en  5 Noviembre 2015, 17:56 PM
prueba con :

Código (vbnet) [Seleccionar]
sw.WriteLine(content & Environment.NewLine)

Saludos

No sirvió con eso pues me colocaba una linea con el registro y una linea vacia.

Investigando logré encontrar un código con el que sí funcionó; entonces cambié esto:

Código (vbnet) [Seleccionar]

Dim content As String = sr.ReadToEnd.Replace(Environment.NewLine, "")
If Not String.IsNullOrEmpty(content) Then
    sw.WriteLine(content & Environment.NewLine)
End If


Por esto:
Código (vbnet) [Seleccionar]

While Not sr.EndOfStream
  Dim content As String = sr.ReadLine
  If content.Length > 0 Then
     sw.WriteLine(content)
End While


Que te parece?


Con esto está haciendo lo que inicialmente se me pidio, ahora tengo que ir con la segunda fase del esto que se está convirtiendo en un proyecto muy interesante.

Te agradezco la ayud que me haz brindado hasta este momento y espero poder seguir contando con ella.

Gracias mil de nuevo.
#12
Cita de: Eleкtro en  5 Noviembre 2015, 16:39 PM
RegEx es lento, intenta evitarlo.

En el método FindAndMergeFiles realiza esta modificación:

Código (vbnet) [Seleccionar]
Using sr As StreamReader = txtfile.OpenText

   Using sw As New StreamWriter(Path.Combine(topDir.FullName, curFilename), append:=True, encoding:=Encoding.Default, bufferSize:=4096)

       Dim content As String = sr.ReadToEnd.Replace(Environment.NewLine, "")
       If Not String.IsNullOrEmpty(content) Then
           sw.WriteLine(content)
       End If

   End Using ' sw

End Using ' sr


La linea que queda en blanco al final del archivo es normal, ya que se está llamando al método WriteLine.

Saludos

Saludos Elektro;

Gracias por responder.

He aplicado el cambio y hace tan bien el trabajo que hasta quita el espacio de fin de registro y junta las lineas ;-), es decir, no toma en cuenta el fin del registro o linea, sino que al final de la linea toma la de abajo y lo concatena con la primera y así sucesivamente.

La idea es que quite las lineas en blanco pero respete la estructura del registro

Gracias mil de nuevo hermano por todo tu apoyo y colaboración.

Ejemplo:
Estado Inicial
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON

CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON

CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON


Estado Final
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON
CAMPO1;CAMPO2;CAMPO3;CAMPO4;CAMPO5;CAMPON


Espero haberme explicado.

Gracias de nuevo....

#13
Saludos amigo,

Estoy testeando la app y le he encontrado un solo detalle y es que luego de que hace el merge de los archivos está dejando una linea en blanco en el archivo final (no se si me explico?)  :-\

Revisando y estudiando el código me doy cuenta que el problema está en la función FindAndMergeFiles, pienso que despues de hacer el merge hay que hacer un barrido del mismo archivo para quitar las lineas vacias, la rutina por lo que he leido sería mas o menos así:
Código (vbnet) [Seleccionar]
archivotxt = Regex.Replace(archivotxt, "^\r|\n\r|\n$", "")

La pregunta sería en que parte y como incluiría esa sentencia en la funcion FindAndMergeFiles.

Desde ya mil gracias de nuevo amigo.



#14
Cita de: Eleкtro en 28 Octubre 2015, 03:29 AM
Esa excepción es síntoma de estar utilizando prácticas recursivas, por algún método/algoritmo con una recursividad excesiva y/o infinita la cual con sus llamadas colapsa el tamaño de la pila o stack, provocando así un overflow.

No puedo reproducir el conflicto con el código que te mostré en lo que denominariamos "circunstancias normales" (no llevando al límite las capacidades para provocar un stack-overflow intencionado).

Muestra el código que estás utilizando ahora.

Por cierto, ¿de cuantos archivos de texto (o veces que se llama el método "Replace" y se adjunta texto al objeto "StringBuilder") estamos hablando exactamente?, es que, para que te diera esa excepción debería ser un número de veces colosal, pero no descartaré la posibilidad ya que no se cuanta magnitud de datos estás trabajando.

Saludos!

Saludos mi amigo,

Cuando puedas dale un vistazo al mensaje privado que te envié.

Gracias.

#15
Cita de: Eleкtro en 28 Octubre 2015, 03:29 AM
Esa excepción es síntoma de estar utilizando prácticas recursivas, por algún método/algoritmo con una recursividad excesiva y/o infinita la cual con sus llamadas colapsa el tamaño de la pila o stack, provocando así un overflow.

No puedo reproducir el conflicto con el código que te mostré en lo que denominariamos "circunstancias normales" (no llevando al límite las capacidades para provocar un stack-overflow intencionado).

Muestra el código que estás utilizando ahora.

Por cierto, ¿de cuantos archivos de texto (o veces que se llama el método "Replace" y se adjunta texto al objeto "StringBuilder") estamos hablando exactamente?, es que, para que te diera esa excepción debería ser un número de veces colosal, pero no descartaré la posibilidad ya que no se cuanta magnitud de datos estás trabajando.

Saludos!

Buenos días bro...

Feliz día del Ingeniero!

Hagamos algo mejor...

Te voy a enviar en un PM un enlace para que bajes los archivos y la solucion.

Saludos y de nuevo mil gracias.

#16
Cita de: Eleкtro en 27 Octubre 2015, 18:49 PM
Tienes razón, no me di cuenta que declaré dos funciones con las prisas xD

Reectifico lo que dije aquí:
Está todo bien, solo que tienes que ignorar eso último que dije, tienes que usar la otra función ...la que ya es publica, pues esa función llama a la función privada.

Saludos

El hecho de poder decirte que hay errores me apena... jajajajajaja

Pues te cuento que ya no da error el compilador pero cuando ejecuto el utilitario me está dando un System.StackOverflowException o pila sobrecargada en

   Public Function Replace(ByVal sender As String,
                            ByVal findWhat As String,
                            ByVal replaceWith As String,
                            ByVal comparisonType As StringComparison,
                            ByVal stringBuilderCapacity As Integer) As String


Estaba investigando y encuentro en el VS el siguiente mensaje:
The maximum number of stack frames supported by Visual Studio has been exceeded.   

Existe alguna forma de incrementar ese parámetro?
o alguna alternativa para evitar este overflow?

Gracias de nuevo mi pana....
#17
Cita de: Eleкtro en 27 Octubre 2015, 02:16 AM
Imagino que estas usando esta extensión de método?:

La cual por cierto no se por que la declaré von visibilidad Private, modifica el keyword Private por Public para poder utilizarla.

Aparte, el parámetro sender se asigna automaticamente, debes ignorarlo y dejarlo así:
Código (vbnet) [Seleccionar]
...Replace(txtfind, txtreplace, comparisonType)

saludos

Buenos días bro;

Si estoy usando tal cual lo que me diste.

La función queda así:

Código (vbnet) [Seleccionar]

    Private Function Replace(ByVal sender As String,
                             ByVal findWhat As String,
                             ByVal replaceWith As String,
                             ByVal comparisonType As StringComparison,
                             ByVal stringBuilderCapacity As Integer) As String

        If String.IsNullOrEmpty(sender) Then
            Return sender

        ElseIf String.IsNullOrEmpty(findWhat) Then
            Throw New ArgumentNullException(paramName:="findWhat")

        Else
            Return StringExtensions.Replace(findWhat, replaceWith, comparisonType)

        End If


Ahora hay otro detalle del que me estoy dando cuenta; tienes dos funciones llamas igual, una privada y otra publica; pero al hacerlas ambas Publicas el VS da error.

Estas son las funciones:
Código (vbnet) [Seleccionar]

    Public Function Replace(ByVal sender As String,
                            ByVal findWhat As String,
                            ByVal replaceWith As String,
                            ByVal comparisonType As StringComparison) As String
        If String.IsNullOrEmpty(sender) Then
            Return sender
        ElseIf String.IsNullOrEmpty(findWhat) Then
            Throw New ArgumentNullException(paramName:="findWhat")
        Else
            Return StringExtensions.Replace(sender, findWhat, replaceWith, comparisonType, stringBuilderCapacity:=0)
        End If
    End Function


Esta es la otra:

Código (vbnet) [Seleccionar]

Private Function Replace(ByVal sender As String,
                             ByVal findWhat As String,
                             ByVal replaceWith As String,
                             ByVal comparisonType As StringComparison,
                             ByVal stringBuilderCapacity As Integer) As String
        If String.IsNullOrEmpty(sender) Then
            Return sender
        ElseIf String.IsNullOrEmpty(findWhat) Then
            Throw New ArgumentNullException(paramName:="findWhat")
        Else
            Dim posCurrent As Integer = 0
            Dim lenPattern As Integer = findWhat.Length
            Dim idxNext As Integer = sender.IndexOf(findWhat, comparisonType)
            Dim result As New StringBuilder(capacity:=If(stringBuilderCapacity <= 0, Math.Min(4096, sender.Length), stringBuilderCapacity))
            While (idxNext >= 0)
                result.Append(sender, posCurrent, (idxNext - posCurrent))
                result.Append(replaceWith)
                posCurrent = (idxNext + lenPattern)
                idxNext = sender.IndexOf(findWhat, posCurrent, comparisonType)
            End While
            result.Append(sender, posCurrent, (sender.Length - posCurrent))
            Return result.ToString
        End If
    End Function


Gracias mil de nuevo amigo.
#18
Cita de: Eleкtro en 26 Octubre 2015, 17:55 PM
Supuestamente no estás haciendo nada mal y tampoco te debería saltar ningún warning.

Los 4 primeros parámetros del método FindFileAndReplaceTextIn son de tipo String, y el quinto parámetro es del tipo StringComparison, por ende, si tu le estás pasando 4 strings + un StringComparison entonces no entiendo en absoluto por que te salta el warning, ya que no debería.

Solo se me ocurre que hayas modificado la parametización del método FindFileAndReplaceTextIn cambiando el orden del último parámetro ...¿?

De todas formas, tengas el orden de los parámetros como lo tengas, siempre puedes usar parámetros nombrados (named parameters) para especificar estrictamente a que parámetro correspodne cada valor que le pasas al método:
Código (vbnet) [Seleccionar]
FindFileAndReplaceTextIn(sourceDir:=sourceDir, filenameFind:="GL.txt",
                        txtfind:="textbuscar", txtreplace:="textoreemplaza",
                        comparisonType:=comparisonType)


Eso debería solucionar el problema, a menos que hayas modificado algo xD.

Saludos!

Saludos mi pana,

Probé exactamente lo que indicas y me dió error.
Este es el error:


BC30512 Option Strict On disallows implicit conversions from 'String' to 'StringComparison'. WindowsApplication6 C:\Users\liderapp\Documents\Visual Studio 2015\Projects\WindowsApplication6\WindowsApplication6\StringExtensions.vb 91


Al irme a la linea 91 el error lo da aqui:
Replace(txtfile.FullName, txtfind, [b]txtreplace[/b], comparisonType)

Que sugieres hermano...?

#19
Saludos mi pana,

Cada consulta contigo es una clase de .net jejejejejeje  ;-)

Esta es la función FindFileAndReplaceTextIn que me pasaste:
Código (vbnet) [Seleccionar]

Public Sub FindFileAndReplaceTextIn(ByVal sourceDir As String, ByVal filenameFind As String,
                                    ByVal txtfind As String, ByVal txtreplace As String,
                                    ByVal comparisonType As StringComparison)
        For Each topDir As DirectoryInfo In New DirectoryInfo(sourceDir).GetDirectories("*", SearchOption.TopDirectoryOnly)
            For Each txtfile As FileInfo In topDir.GetFiles("*.txt", SearchOption.TopDirectoryOnly)
                If txtfile.Name.Equals(filenameFind, StringComparison.OrdinalIgnoreCase) Then
                    Dim txt As String = File.ReadAllText(txtfile.FullName, Encoding.Default).
                                             Replace(txtfile.FullName, txtfind, txtreplace, comparisonType)
                    File.WriteAllText(txtfile.FullName, txt, Encoding.Default)
                End If
            Next txtfile
        Next topDir
    End Sub


En la definición de los parámetros está txtreplace como String donde según entiendo debería ser StringComparison; ahora bien si lo cambio entonces en el llamado a la función me da otro warning. Precisamente con ese parámetro.

Entonces hago el llamado a la misma de la siguiente forma:
Código (vbnet) [Seleccionar]
FindFileAndReplaceTextIn(sourceDir, "GL.txt", "AGENO-02", "AGEN-03", comparisonType)

Gracias nuevamente.



#20
Ante todo, gracias de nuevo Elektro;

Capté perfectamente el mensaje, de hecho te comparto lo que hice:
1.- En el módulo StringExtensions colgué la función FindFileAndReplaceTextIn
2.- En el módulo DateUtil colgué en la función FindAndMergeFiles justo despues de terminar con el último for la consulta al valor del ComboBox y si el valor es el esperado entonces llamo a la función FindFileAndReplaceTextIn que está en el otro módulo.

Pero hay un detalle y trate de solucionarlo con el mismo asistente que me recomendaste pero no funcionó con ello.

El detalle es que en la función FindFileAndReplaceTextIn se manejan 5 parámetros de los cuales hay uno llamado txtreplace que supuestamente es un String pero debería ser (segun el Visual) StringComparison pero cuando hago el cambo sugerido entonces en la sentencia donde hago el llamado:

Código (vbnet) [Seleccionar]

FindFileAndReplaceTextIn(sourceDir, "GL.txt", "textbuscar", "textoreemplaza", comparisonType)


Me da un warning y el Visual me sugiere que debo cambiarlo a:
Código (vbnet) [Seleccionar]

FindFileAndReplaceTextIn(sourceDir, "GL.txt", "textbuscar", CType("textoreemplaza", StringComparison), comparisonType)


Que es lo que realmente hice mal?
Porque me da esos warnings?

Desde ya mil gracias amigo.