elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Cambiar palabras de un archivo TXT
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Cambiar palabras de un archivo TXT  (Leído 5,702 veces)
Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #10 en: 27 Octubre 2015, 18:49 »

Tienes razón, no me di cuenta que declaré dos funciones con las prisas xD

Reectifico lo que dije aquí:
Citar
La cual por cierto no se por que la declaré von visibilidad Private, modifica el keyword Private por Public para poder utilizarla.

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


En línea


elqueteconte

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #11 en: 27 Octubre 2015, 22:19 »

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
Código:
   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....


« Última modificación: 27 Octubre 2015, 23:30 por elqueteconte » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #12 en: 28 Octubre 2015, 03:29 »

cuando ejecuto el utilitario me está dando un System.StackOverflowException

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!
« Última modificación: 28 Octubre 2015, 03:41 por Eleкtro » En línea


elqueteconte

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #13 en: 28 Octubre 2015, 13:32 »

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.

En línea

elqueteconte

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #14 en: 30 Octubre 2015, 15:40 »

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.

En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #15 en: 30 Octubre 2015, 23:28 »

Para reproducir el error haz lo siguiente ejecuta el script y en Empresa selecciona Mi Diario.

El problema está aquí:

Código
  1.            If (cb.SelectedIndex = 1) Then
  2.                'MessageBox.Show("Selecciono {0}", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Error)
  3.                'cmbemp.Focus()
  4.                Dim comparisonType As StringComparison = StringComparison.OrdinalIgnoreCase
  5.                FindFileAndReplaceTextIn(sourceDir, "GL.txt", "MCBO-02", "MBO-03", comparisonType)
  6.                FindFileAndReplaceTextIn(sourceDir, "GL.txt", "MCBO-03", "MBO-03", comparisonType)
  7.                FindFileAndReplaceTextIn(sourceDir, "IMP6000.txt", "TXT01", "MBO-03", comparisonType)
  8.                FindFileAndReplaceTextIn(sourceDir, "IMP6000.txt", "TXT02", "MBO-03", comparisonType)
  9.            Else
  10.                Exit Sub
  11.            End If

Código
  1.        Public Sub FindFileAndReplaceTextIn(...)
  2.         ...
  3.             Dim txt As String = File.ReadAllText(txtfile.FullName, Encoding.Default).
  4.                                      Replace(txtfind, txtreplace, comparisonType, 128)
  5.         ...
  6.        End Sub

Código
  1.        Public Function Replace(...) As String
  2.  
  3.                Return StringExtensions.Replace(sender, findWhat, replaceWith, comparisonType, stringBuilderCapacity:=0)
  4.  
  5.        End Function

La función Replace se llama a si misma de forma infinita, y eso causa el colapso de la pila.

Se te pasó por alto a ti o a mi añadir la otra función que compartí, el "Replace" que era privado.



Para solucionarlo, reemplaza esto:
Código
  1.        Public Sub FindFileAndReplaceTextIn(...)
  2.         ...
  3.             Dim txt As String = File.ReadAllText(txtfile.FullName, Encoding.Default).
  4.                                      Replace(txtfind, txtreplace, comparisonType, 128)
  5.         ...
  6.        End Sub

por esto otro:

Código
  1.        Public Sub FindFileAndReplaceTextIn(...)
  2.         ...
  3.             Dim txt As String = File.ReadAllText(txtfile.FullName, Encoding.Default).
  4.                                      Replace(txtfind, txtreplace, comparisonType)
  5.         ...
  6.        End Sub

Y reemplaza el contenido del modulo "StringExtensions", por esto:

Código
  1. ' ESTE MODULO ESTÁ INCOMPLETO, SOLO LE AÑADÍ LAS FUNCIOENS DE REEMPLAZAMIENTO DE TEXTO.
  2. ' SI QUIERES EL CÓDIGO FUENTE COMPLETO CON MÁS FUNCIONES INTERESANTES, PUEDES DESCARGARLO AQUÍ:
  3. ' https://github.com/ElektroStudios/VBNetSnippets/blob/master/String/String%20Extensions.vb
  4.  
  5. #Region " Public Members Summary "
  6.  
  7. #Region " Functions "
  8.  
  9. ' String.Replace(String, String, StringComparison) As String
  10. ' String.ReplaceRegEx(String, String, RegExOptions) As String
  11.  
  12. #End Region
  13.  
  14. #End Region
  15.  
  16. #Region " Option Statements "
  17.  
  18. Option Strict On
  19. Option Explicit On
  20. Option Infer Off
  21.  
  22. #End Region
  23.  
  24. #Region " Imports "
  25.  
  26. Imports System
  27. Imports System.Linq
  28. Imports System.Diagnostics
  29. Imports System.Runtime.CompilerServices
  30. Imports System.Text
  31. Imports System.Text.RegularExpressions
  32.  
  33. #End Region
  34.  
  35. Namespace Tools
  36.  
  37.    ''' ----------------------------------------------------------------------------------------------------
  38.    ''' <summary>
  39.    ''' Contains custom extension methods to use with a <see cref="String"/>.
  40.    ''' </summary>
  41.    ''' ----------------------------------------------------------------------------------------------------
  42.    Public Module StringExtensions
  43.  
  44. #Region " Public Extension Methods "
  45.  
  46.        ''' ----------------------------------------------------------------------------------------------------
  47.        ''' <summary>
  48.        ''' Replaces text using a regular expression.
  49.        ''' </summary>
  50.        ''' ----------------------------------------------------------------------------------------------------
  51.        ''' <example> This is a code example.
  52.        ''' <code>
  53.        ''' Dim str As String = "Hello World!".ReplaceRegEx("world", "kitty", RegexOptions.IgnoreCase)
  54.        ''' </code>
  55.        ''' </example>
  56.        ''' ----------------------------------------------------------------------------------------------------
  57.        ''' <param name="sender">
  58.        ''' The source <see cref="String"/>.
  59.        ''' </param>
  60.        '''
  61.        ''' <param name="findWhat">
  62.        ''' The <see cref="Regex"/> find expression.
  63.        ''' </param>
  64.        '''
  65.        ''' <param name="regexOptions">
  66.        ''' The <see cref="RegexOptions"/>.
  67.        ''' </param>
  68.        ''' ----------------------------------------------------------------------------------------------------
  69.        ''' <exception cref="ArgumentNullException">
  70.        ''' findWhat
  71.        ''' </exception>
  72.        ''' ----------------------------------------------------------------------------------------------------
  73.        ''' <returns>
  74.        ''' The replaced string.
  75.        ''' </returns>
  76.        ''' ----------------------------------------------------------------------------------------------------
  77.        <DebuggerStepThrough>
  78.        <Extension>
  79.        Public Function ReplaceRegEx(ByVal sender As String,
  80.                                     ByVal findWhat As String,
  81.                                     ByVal replaceWith As String,
  82.                                     Optional ByVal regexOptions As RegexOptions =
  83.                                                    RegularExpressions.RegexOptions.None) As String
  84.  
  85.            If String.IsNullOrEmpty(sender) Then
  86.                Return sender
  87.  
  88.            ElseIf String.IsNullOrEmpty(findWhat) Then
  89.                Throw New ArgumentNullException(paramName:="findWhat")
  90.  
  91.            Else
  92.                Return Regex.Replace(sender, findWhat, replaceWith, regexOptions)
  93.  
  94.            End If
  95.  
  96.        End Function
  97.  
  98.        ''' ----------------------------------------------------------------------------------------------------
  99.        ''' <summary>
  100.        ''' Replaces text using the specified string comparison type.
  101.        ''' </summary>
  102.        ''' ----------------------------------------------------------------------------------------------------
  103.        ''' <example> This is a code example.
  104.        ''' <code>
  105.        ''' Dim str As String = "Hello World!".Replace("world", "kitty", StringComparison.OrdinalIgnoreCase)
  106.        ''' </code>
  107.        ''' </example>
  108.        ''' ----------------------------------------------------------------------------------------------------
  109.        ''' <param name="sender">
  110.        ''' The source <see cref="String"/>.
  111.        ''' </param>
  112.        '''
  113.        ''' <param name="findWhat">
  114.        ''' The <see cref="Regex"/> find expression.
  115.        ''' </param>
  116.        '''
  117.        ''' <param name="comparisonType">
  118.        ''' The string comparison type.
  119.        ''' </param>
  120.        ''' ----------------------------------------------------------------------------------------------------
  121.        ''' <exception cref="ArgumentNullException">
  122.        ''' findWhat
  123.        ''' </exception>
  124.        ''' ----------------------------------------------------------------------------------------------------
  125.        ''' <returns>
  126.        ''' The replaced string.
  127.        ''' </returns>
  128.        ''' ----------------------------------------------------------------------------------------------------
  129.        <DebuggerStepThrough>
  130.        <Extension>
  131.        Public Function Replace(ByVal sender As String,
  132.                                ByVal findWhat As String,
  133.                                ByVal replaceWith As String,
  134.                                ByVal comparisonType As StringComparison) As String
  135.  
  136.            If String.IsNullOrEmpty(sender) Then
  137.                Return sender
  138.  
  139.            ElseIf String.IsNullOrEmpty(findWhat) Then
  140.                Throw New ArgumentNullException(paramName:="findWhat")
  141.  
  142.            Else
  143.                Return StringExtensions.InternalReplace(sender, findWhat, replaceWith, comparisonType, stringBuilderCapacity:=-1)
  144.  
  145.            End If
  146.  
  147.        End Function
  148.  
  149. #End Region
  150.  
  151. #Region " Private Methods "
  152.  
  153.        ''' ----------------------------------------------------------------------------------------------------
  154.        ''' <summary>
  155.        ''' Replaces text using the specified string comparison type.
  156.        ''' </summary>
  157.        ''' ----------------------------------------------------------------------------------------------------
  158.        ''' <example> This is a code example.
  159.        ''' <code>
  160.        ''' Dim str As String = "Hello World!".Replace("world", "kitty", StringComparison.OrdinalIgnoreCase)
  161.        ''' </code>
  162.        ''' </example>
  163.        ''' ----------------------------------------------------------------------------------------------------
  164.        ''' <param name="sender">
  165.        ''' The source <see cref="String"/>.
  166.        ''' </param>
  167.        '''
  168.        ''' <param name="findWhat">
  169.        ''' The <see cref="Regex"/> find expression.
  170.        ''' </param>
  171.        '''
  172.        ''' <param name="comparisonType">
  173.        ''' The string comparison type.
  174.        ''' </param>
  175.        '''
  176.        ''' <param name="stringBuilderCapacity">
  177.        ''' The initial buffer size of the <see cref="Stringbuilder"/>.
  178.        ''' This parameter is reserved for testing purposes.
  179.        ''' </param>
  180.        ''' ----------------------------------------------------------------------------------------------------
  181.        ''' <returns>
  182.        ''' The replaced string.
  183.        ''' </returns>
  184.        ''' ----------------------------------------------------------------------------------------------------
  185.        <DebuggerHidden>
  186.        <DebuggerStepThrough>
  187.        Private Function InternalReplace(ByVal sender As String,
  188.                                         ByVal findWhat As String,
  189.                                         ByVal replaceWith As String,
  190.                                         ByVal comparisonType As StringComparison,
  191.                                         ByVal stringBuilderCapacity As Integer) As String
  192.  
  193.            Dim posCurrent As Integer = 0
  194.            Dim lenPattern As Integer = findWhat.Length
  195.            Dim idxNext As Integer = sender.IndexOf(findWhat, comparisonType)
  196.            Dim result As New StringBuilder(capacity:=If(stringBuilderCapacity <= 0, Math.Min(4096, sender.Length), stringBuilderCapacity))
  197.  
  198.            While (idxNext >= 0)
  199.                result.Append(sender, posCurrent, (idxNext - posCurrent))
  200.                result.Append(replaceWith)
  201.  
  202.                posCurrent = (idxNext + lenPattern)
  203.                idxNext = sender.IndexOf(findWhat, posCurrent, comparisonType)
  204.            End While
  205.  
  206.            result.Append(sender, posCurrent, (sender.Length - posCurrent))
  207.  
  208.            Return result.ToString
  209.  
  210.        End Function
  211.  
  212. #End Region
  213.  
  214.    End Module
  215.  
  216. End Namespace

Saludos
« Última modificación: 30 Octubre 2015, 23:37 por Eleкtro » En línea


elqueteconte

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #16 en: 3 Noviembre 2015, 13:31 »

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
  1. 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.



« Última modificación: 5 Noviembre 2015, 15:21 por elqueteconte » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #17 en: 5 Noviembre 2015, 16:39 »

RegEx es lento, intenta evitarlo.

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

Código
  1. Using sr As StreamReader = txtfile.OpenText
  2.  
  3.    Using sw As New StreamWriter(Path.Combine(topDir.FullName, curFilename), append:=True, encoding:=Encoding.Default, bufferSize:=4096)
  4.  
  5.        Dim content As String = sr.ReadToEnd.Replace(Environment.NewLine, "")
  6.        If Not String.IsNullOrEmpty(content) Then
  7.            sw.WriteLine(content)
  8.        End If
  9.  
  10.    End Using ' sw
  11.  
  12. 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
En línea


elqueteconte

Desconectado Desconectado

Mensajes: 36


Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #18 en: 5 Noviembre 2015, 16:49 »

RegEx es lento, intenta evitarlo.

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

Código
  1. Using sr As StreamReader = txtfile.OpenText
  2.  
  3.    Using sw As New StreamWriter(Path.Combine(topDir.FullName, curFilename), append:=True, encoding:=Encoding.Default, bufferSize:=4096)
  4.  
  5.        Dim content As String = sr.ReadToEnd.Replace(Environment.NewLine, "")
  6.        If Not String.IsNullOrEmpty(content) Then
  7.            sw.WriteLine(content)
  8.        End If
  9.  
  10.    End Using ' sw
  11.  
  12. 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....

« Última modificación: 5 Noviembre 2015, 16:55 por elqueteconte » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Cambiar palabras de un archivo TXT
« Respuesta #19 en: 5 Noviembre 2015, 17:56 »

prueba con :

Código
  1. sw.WriteLine(content & Environment.NewLine)

Saludos
En línea


Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines