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ú

Temas - elqueteconte

#1
Saludos amigos,

Tiempo sin andar por acá.

En esta oportunidad vengo a hacerles una consulta; necesito hacer tres cosas:
1.- Leer la estructura de un archivo txt cuyos campos están separados por punto y coma.
2.- Leer cada campo del registro y validar si el campo tiene datos o está vacio, si tiene valores numericos cuando debe ser alfanumericos.
3.- Si encuentra errores en los registros ir guardandolos en otro txt y al fina dar un resumen, es decir, se procesaron X registros los cuales Y tienen errores e indicar cada registro con su error al lado

Alguien podría darme una mano con esto?

Gracias mil desde ya.

#2
.NET (C#, VB.NET, ASP) / Leer nombre de carpetas
9 Noviembre 2015, 14:50 PM
Saludos amigos,

Tengo una función que lee el nombre de carpetas tomando en cuenta la selección de un mes, y las mueve a una carpeta principal.

Esta función fue desarrollada por Elektro y aquí se las comparto.

Código (vbnet) [Seleccionar]

        Public Sub MoveDateDirectories(ByVal year As Integer,
                                       ByVal month As Integer,
                                       ByVal dateFormat As String,
                                       ByVal sourceDir As String,
                                       ByVal targetDir As String)
            If (CStr(year).Length <> 4I) Then
                Throw New ArgumentOutOfRangeException(paramName:="year", message:="A value of 4 digits' is required.")
                'ElseIf (month < 1I) OrElse (month > 12I) Then
                '    Throw New ArgumentOutOfRangeException(paramName:="month", message:="A value from range '1' to '12' is required.")
                'ElseIf (dateFormat.Replace("y", "").Replace("M", "").Replace("d", "").Length <> 0) Then
                '    Throw New NotImplementedException(message:="Specified date format is not implemented, only 'yyyy', 'MM' and 'dd' are interchangeable.")
                'ElseIf Not Directory.Exists(sourceDir) Then
                '    Throw New DirectoryNotFoundException(message:=String.Format("Source directory not found: '{0}'", targetDir))
                'ElseIf Not Directory.Exists(targetDir) Then
                '    Throw New DirectoryNotFoundException(message:=String.Format("Target directory not found: '{0}'", targetDir))
            Else
                Dim sourceDirInfo As New DirectoryInfo(sourceDir)
                Dim targetDirInfo As New DirectoryInfo(targetDir)
                ' Obtengo una colección con los nombres de directorio con el formato de fecha especificado. (ej. de Octubre 2015:  20151001 ... 20151031)
                Dim dateDirNames As IEnumerable(Of String) =
                    From day As Integer In Enumerable.Range(1, DateTime.DaysInMonth(year, month))
                    Select dateFormat.Replace("yyyy", CStr(year)).
                                                  Replace("MM", CStr(month).PadLeft(2, "0"c)).
                                                  Replace("dd", CStr(day).PadLeft(2, "0"c))
                ' Obtengo una colección con las rutas absolutas de los directorios que cumplen los requisitos.
                Dim directories As IEnumerable(Of DirectoryInfo) =
                    From dirInfo As DirectoryInfo In sourceDirInfo.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)
                    Where dateDirNames.Contains(dirInfo.Name)
                ' Un simple mensaje de información o aviso cuando no se encuentra ningún directorio el cual mover.
                If (Not directories.Any) Then
                    Dim msg As String = String.Format("No ha sido encontrado ningún directorio en '{0}' que cumpla las condiciones de formato de fecha.", sourceDirInfo.FullName)
                    MessageBox.Show(msg, " ", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Else
                    ' Por último, muevo los directorios que cumplieron las condiciones de formato de fecha.
                    For Each dirInfo As DirectoryInfo In directories
                        Debug.WriteLine(String.Format("Moviendo: {0}", dirInfo.FullName))
                        Try
                            dirInfo.MoveTo(Path.Combine(targetDirInfo.FullName, dirInfo.Name))
                        Catch ex As Exception
#If DEBUG Then
                            Throw
#Else
                        MessageBox.Show(ex.Message & Environment.NewLine & ex.StackTrace, "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Error)
#End If
                        End Try
                    Next dirInfo
                    '                MessageBox.Show("Operación finalizada.", "By Elektro", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If ' Not directories.Any
            End If ' dateFormat...
        End Sub


Esta trabaja perfecto sin problemas; salvo que ahora necesito adecuarla de manera que sea posible mover días, es decir, si el usuario selecciona desde el 01-12-2015 hasta el 15-12-2015 (ambos inclusive); el proceso solo mueva esos días.

Alguien podría orientarme de como adecuar esta función para que haga lo que necesito?

Desde ya mil gracias...
#3
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.