Texto a arrays [SOLUCIONADO]

Iniciado por rob1104, 5 Abril 2011, 18:20 PM

0 Miembros y 1 Visitante están viendo este tema.

rob1104

Hola a todos, necesito un poco de orientación en un proceso que no puedo solucionar.

Resulta que tengo un archivo de texto con miles de lineas con el siguiente formato (este lo genera un sistema que no puedo cambiar):
Citar00304-001    1042X250X131MM(150)51B/CK *750 84-0070      00304-001            1,440   1           600   2           300         1,740
00304-002    507X257X131(150)51 B/C K *450  84-0061      00304-002                0   4         1,050   1           150           900
00304-003    507X252X258MM (150)51BCK *450  84-0020      00304-003            1,200   0             0   2           300           900
00304-006    1042X507X256(75)51 B/C K *225  84-0058      00304-006              402   0             0   0             0           402
00304-012    1500X793 (200) 32 C K  *400    84-0146      00304-012              730   0             0   1           200           530

La idea es pasarlos a un listview para luego trabajar con los datos. El detalle es que no logro separar cada linea en las 9 columnas, ya que la separación no es un tab, si no que son espacios variables, por lo tanto split() no me sirvió.

Este es el codigo que tengo, pero me lo carga todo en una sola columna, ya que no me respeta el split:
Código (vb) [Seleccionar]
Dim linea As String
   Dim division() As String
   Dim i As Integer
   Dim r As String
   Dim subE As ListItem
   Open "C:\INV320.TXT" For Input As #1
   While Not EOF(1)
       Line Input #1, linea
       division = Split(linea)
       r = Mid(division(0), 1, 1)
       If r = "0" Then
           Set subE = ListView1.ListItems.Add(, , division(0))
           For i = 1 To UBound(division)
               subE.SubItems(i) = division(i)
           Next
       End If
   Wend
   Close #1


Y esta es la salida:


Saludos
Sin análisis de requisitos o sin diseño, programar es el arte de crear errores en un documento de texto vacío.

Psyke1

#1
*Una forma sería usando [Bucle + Replace()] en cada linea para que te quede todo separado por un solo espacio.
*Otra sería usando RegExp, con algo así, si no me equivoco:
\s*(\S+)\s*



A parte de eso, usas mal el Split(), si te fijas, no pusiste delimitador. :rolleyes:

DoEvents! :P


rob1104

Gracias por responder, intentaré lo de las Exp Reg que no se me habia ocurrido.

Lo del split(), lo use de diferentes formas, pero al ultimo lo deje asi al copiar el codigo. Pero de la forma que lo tenia era:
division = Split(linea,vbTab)

Bueno, probaré y les cuento. Gracias
Sin análisis de requisitos o sin diseño, programar es el arte de crear errores en un documento de texto vacío.

seba123neo

esto es facil, el archivo tiene definido un largo fijo para cada campo, con un Mid() lo solucionas, o sea desde la posicion 0 a la 13 tenes el codigo, de la 14 a la 25 la descripcion etc...con eso ya lo tenes.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

Sanlegas

Primero elimina los dobles espacios  :P
Código (vb) [Seleccionar]

Do While cbool(instr(MisDatos,"  ")) ' mientras haya doble espacio
MisDatos = replace(Misdatos,"  "," ")  'remplazamos los dobles espacios por uno solo
loop
Partes() = Split(MisDatos,vbnewline) ' primero se parten por lineas
for i = 0 to ubound(Partes()) - 1
SubPartes() = Split(Partes(i)," ") 'partimos por los espacios y tenemos los datos...
next



rob1104

Muchas gracias a todos.

Logré solucionarlo gracias a la idea de seba123neo.

Al final el codigo quedó asi:
       
Código (vb) [Seleccionar]
Dim linea As String, archivo As String, division(6) As String, aux As String
        Dim i As Integer
        Dim subE As ListItem
        archivo = Trim(OFName.lpstrFile)
        Open archivo For Input As #1
        While Not EOF(1)
            Line Input #1, linea
            aux = Mid(linea, 1, 1)
            division(0) = Trim(Mid(linea, 1, 13)) 'Caja
            division(1) = Trim(Mid(linea, 14, 31)) 'Descripcion
            division(2) = Trim(Mid(linea, 45, 13)) 'Caja/Cliente
            division(3) = Trim(Mid(linea, 59, 13)) 'Producto
            division(4) = Trim(Mid(linea, 72, 13)) 'Exi. Actual
            division(5) = Trim(Mid(linea, 85, 20)) 'Peso
            division(6) = Trim(Mid(linea, 106, 20)) 'Precio
           
            If aux = "0" Then
                Set subE = lv.ListItems.Add(, , division(0))
                For i = 1 To UBound(division)
                    subE.SubItems(i) = division(i)
                Next
            End If
        Wend
        Close #1


Saludos
Sin análisis de requisitos o sin diseño, programar es el arte de crear errores en un documento de texto vacío.