Hola chicos espero se acuerden de mi jejej por problemas de trabajo he tenido que dejar hace algún tiempo la programación y estoy bastante perdido,los que me conocen ya saben que programo por gusto y siempre pensando en lo imposible .(ganar la loteria ) por ejemplo y aca tengo un codigo que no logro hacerlo andar ,de verdad que he perdido facultades eso es lo malo de tener 62 años :(
Bien alguien puede decirme que le pasa a este código ?
Private Sub btnProcesar_Click(sender As Object, e As EventArgs) Handles btnProcesar.Click
' Lee los registros del archivo de texto
Dim registros
As List
(Of String) = New List
(Of String)(IO.
File.
ReadAllLines("ruta_del_archivo.txt"))
' Crea una variable para almacenar los resultados
Dim resultados As String = ""
' Itera sobre los registros y procesa cada uno
For Each registro As String In registros
' Separa los números del registro en un array
Dim numeros() As String = registro.Split(" "c)
' Verifica que el último número no sea mayor que 49
If Integer.Parse(numeros(5)) <= 49 Then
' Encuentra la constante entre los números
Dim constante As Integer = Integer.Parse(numeros(1)) - Integer.Parse(numeros(0))
' Cuenta cada cuántos registros aparece esa constante
Dim contador As Integer = 1
For i As Integer = 2 To numeros.Length - 1 Step 1
If Integer.Parse(numeros(i)) - Integer.Parse(numeros(i - 1)) = constante Then
contador += 1
Else
Exit For
End If
Next
' Agrega los resultados al string de resultados
resultados &= "Constante: " & constante.ToString() & ", se repite cada " & contador.ToString() & " registros" & Environment.NewLine
End If
Next
' Muestra los resultados en el TextBox
txtResultados.Text = resultados
End Sub
saludos
Luis
Hola!
Qué error te da? Probaste debuggear con el IDE?
Saludos!
lo he modificado ahora se ejecuta sin errores pero sigue sin mostradme resultados ?
Imports System.IO
Public Class Form1
Private Sub BTNProcesar_Click(sender As Object, e As EventArgs) Handles btnProcesar.Click
' Lee los registros del archivo de texto
Dim registros
As List
(Of String) = New List
(Of String)(IO.
File.
ReadAllLines("C:\Users\34625\Desktop\bonoloto\1.txt"))
' Crea una variable para almacenar los resultados
Dim resultado As String = ""
Dim resultado2 As String = ""
' Define el valor máximo de la barra de progreso
Dim valorMaximo As Integer = registros.Count
' Configura la barra de progreso
ProgressBar1.Minimum = 0
ProgressBar1.Maximum = valorMaximo
ProgressBar1.Value = 0
' Itera sobre los registros y procesa cada uno
For Each registro As String In registros
' Verifica que la cadena tenga el formato adecuado
If registro.Length >= 30 Then
' Separa los números del registro en un array
Dim numeros() As String = registro.Substring(11, 14).Split(" "c)
' Verifica que haya seis números en el array
If numeros.Length = 6 Then
' Verifica que los números sean válidos
Dim numerosValidos As Boolean = True
For Each numero As String In numeros
If Not IsNumeric(numero) OrElse Integer.Parse(numero) < 1 OrElse Integer.Parse(numero) > 49 Then
numerosValidos = False
Exit For
End If
Next
If numerosValidos Then
' Encuentra la constante entre los números
Dim constante As Integer = Integer.Parse(numeros(1)) - Integer.Parse(numeros(0))
' Cuenta cada cuántos registros aparece esa constante
Dim contador As Integer = 1
For i As Integer = 2 To numeros.Length - 1 Step 1
If Integer.Parse(numeros(i)) - Integer.Parse(numeros(i - 1)) = constante Then
contador += 1
Else
Exit For
End If
Next
' Agrega los resultados al string de resultados
resultado &= "Constante: " & constante.ToString() & ", se repite cada " & contador.ToString() & " registros" & Environment.NewLine
' Cuenta cada cuántos registros aparece una constante par o impar
Dim contador2 As Integer = 0
For Each numero As String In numeros
If Integer.Parse(numero) Mod 2 = 0 And constante Mod 2 = 0 Then
contador2 += 1
ElseIf Integer.Parse(numero) Mod 2 <> 0 And constante Mod 2 <> 0 Then
contador2 += 1
End If
Next
' Agrega los resultados al string de resultados 2
resultado2 &= "Constante: " & constante.ToString() & ", se repite cada " & contador2.ToString() & " registros" & Environment.NewLine
End If
End If
End If
' Actualiza el valor de la barra de progreso
ProgressBar1.Value += 1
Next
' Muestra los resultados en el TextBox
TextBox1.Text = resultado
TextBox2.Text = resultado2
End Sub
End Class
vale que no me encuentre en el primer texbox ya que son pocos registros para la comparativa pero la otra funcion tampoco me muestra nada en el segundo texbox
saludos
Hola Luis...
En principio (de un vistazxo simple) el código no parece contener errores...
...pero puede haber errores semánticos, que son los más difíciles de localizar.
El error semántico, es un error tal que hace algo y lo hace bien, pero no es exactamente lo que uno quiere que haga .
Vamos a tratar de descubrir si los hay, cuales pudieran ser...
De entrada, esto es conveniente que controle posibles errores
' Lee los registros del archivo de texto
Dim registros
As List
(Of String) = New List
(Of String)(IO.
File.
ReadAllLines("C:\Users\34625\Desktop\bonoloto\1.txt"))
Procede por tanto envolverlo en un controlador de error:
Try
' Lee los registros del archivo de texto
Dim registros
As List
(Of String) = New List
(Of String)(IO.
File.
ReadAllLines("C:\Users\34625\Desktop\bonoloto\1.txt"))
Catch
messagebox.show("Hubo un error al tratar de leer el fichero..."
exit sub
end try
'...el resto del codigo...
También podías usar el parámetro ' StringSplitOptions.RemoveEmptyEntries', para deshacerte de líneas vacías si el fichero contuviera alguna...
Seguimos... dentro del bucle principal, tenemos la línea:
' Verifica que la cadena tenga el formato adecuado
If registro.Length >= 30 Then
No hay un 'else'... luego no sabemos cuántas líneas caen dentro y cuántas fuera...
No es extrictamente necesario, pero si no se obtiene el resultado esperado, lo adecuado es controlar dicha situación y ver si por aquí hay un 'coladero'... el fichero podría tener al final, saltos de línea a mansalva (como separador de campos, en vez de tabuladores).
Entonces antes del bucle sería adecuaod poner cuantas líneas fueron leídas del fichero:
dim RegistrosCortos as integer
For Each registro As String In registros
' Verifica que la cadena tenga el formato adecuado
If registro.Length >= 30 Then
... el código principal
else
RegistrosCortos +=1
end if
next
messagebox.show("El fichero tiene " & registros.count.tostring & " lineas... de las cuales tienen menos de 30 caracteres " & RegistrosCortos.tostring & " lineas."
Esto es porque si consideramos el caso de que una línea fueran 6 números entre el 1 y el 49, y suponiendo que los valores 1-9 fueran todos antecedidos de un '0', tendríamos (como máximo) solo 17 caracteres (6 números * 2 digitos) + 5 espacios entre los 6 números = 17, que son bastante menos que los 30 esperados....
En realidad esa comparación yo la eliminaría por completo, dado que luego viene otra que es más certera al caso: ' Verifica que haya seis numeros en el array
If numeros.Length = 6 Then
Luego ahí podría residir probablemente tu error semántico... creer que el largo de cada línea es como mínimo de 30 caracteres.Lo demás aunque es mejorable, no hay posibilidad de otros errores. En realidad sabiendo que el fichero solo contiene números del 1 al 49, espacios y saltos de líneas, sobran algunas verificaciones... pero si existe el riesgo de manipulación externa, pudiera ser necesario y en tal caso avisar pues deja el fichero de alguna forma corrupto.
Prueba a eliminar dichas líneas o al menos comentarlas y verifica si ahora el resultado es el esperado...