Buscar cadenas duplicadas en un txt y eliminar la fila completa

Lo que necesito es crear un archivo bat para modificar archivos txt pero antes necesito eliminar filas que están semi duplicadas puesto que luego voy a importar esos txt a un ejecutable .jar
Archivo original
El archivo de texto lo tengo así se llama descaga_2017
642926 |128 |C012644 |99 |3661351 |0160348B |2 |0.00 |0.00 |0.00 | | |
642926 |128 |C012644 |99 |3661352 |0160348 |6 |1.533 |0 |9.19800000 | |21 |
642926 |128 |C012644 |99 |3661353 |0160348B |2 |0.000 |0 |0.00000000 | |21
642949 |128 |C010241 |99 |3661485 |84155616B |2 |0.00 |0.00 |0.00 | | |
642949 |128 |C010241 |99 |3661486 |84154530 |4 |4.025 |0 |16.10000000 | |21 |
642949 |128 |C010241 |99 |3661487 |575427 |2 |4.025 |0 |8.05000000 | |21 |
642949 |128 |C010241 |99 |3661488 |0160348B |2 |0.00 |0.00 |0.00 | | |
642949 |128 |C010241 |99 |3661489 |0160348 |6 |1.533 |0 |9.19800000 | |21 |
642949 |128 |C010241 |99 |3661490 |0160348B |2 |0.000 |0 |0.00000000 | |21 |
642949 |128 |C010241 |99 |3661491 |0070181 |1 |27.254 |0 |27.25400000 | |11 |
642950 |128 |C010241 |99 |3661492 |101032 |1 |46.900 |0 |46.90000000 | |31 |
642980 |128 |C014433 |99 |3661655 |0040232B |1 |0.00 |0.00 |0.00 | | |
642980 |128 |C014433 |99 |3661656 |0040232 |2 |20.246 |0 |40.49200000 | |21 |
642980 |128 |C014433 |99 |3661657 |0040232b |1 |0.000 |0 |0.00000000 | |21 |
643043 |128 |C010278 |99 |3662001 |4700001b |2 |0.00 |0.00 |0.00 | | |
643043 |128 |C010278 |99 |3662002 |4700001 |1 |8.474 |0 |8.47400000 | |21 |
643043 |128 |C010278 |99 |3662003 |4700001B |2 |0.000 |0 |0.00000000 | |21 |
........
......
...
archivo enumerado para la explicacion:
1.642926 |128 |C012644 |99 |3661351 |0160348B |2 |0.00 |0.00 |0.00 | | |
2.642926 |128 |C012644 |99 |3661352 |0160348 |6 |1.533 |0 |9.19800000 | |21 |
3.642926 |128 |C012644 |99 |3661353 |0160348B |2 |0.000 |0 |0.00000000 | |21 | << eliminar toda la fila
4.642949 |128 |C010241 |99 |3661485 |84155616B |2 |0.00 |0.00 |0.00 | | |
5.642949 |128 |C010241 |99 |3661486 |84154530 |4 |4.025 |0 |16.10000000 | |21 |
6.642949 |128 |C010241 |99 |3661487 |575427 |2 |4.025 |0 |8.05000000 | |21 |
7.642949 |128 |C010241 |99 |3661488 |0160348B |2 |0.00 |0.00 |0.00 | | |
8.642949 |128 |C010241 |99 |3661489 |0160348 |6 |1.533 |0 |9.19800000 | |21 |
9.642949 |128 |C010241 |99 |3661490 |0160348B |2 |0.000 |0 |0.00000000 | |21 | << eliminar toda la fila
10.642949 |128 |C010241 |99 |3661491 |0070181 |1 |27.254 |0 |27.25400000 | |11 |
11.642950 |128 |C010241 |99 |3661492 |101032 |1 |46.900 |0 |46.90000000 | |31 |
12.642980 |128 |C014433 |99 |3661655 |0040232B |1 |0.00 |0.00 |0.00 | | |
13.642980 |128 |C014433 |99 |3661656 |0040232 |2 |20.246 |0 |40.49200000 | |21 |
14.642980 |128 |C014433 |99 |3661657 |0040232b |1 |0.000 |0 |0.00000000 | |21 | << eliminar toda la fila
15.643043 |128 |C010278 |99 |3662001 |4700001b |2 |0.00 |0.00 |0.00 | | |
16.643043 |128 |C010278 |99 |3662002 |4700001 |1 |8.474 |0 |8.47400000 | |21 |
17.643043 |128 |C010278 |99 |3662003 |4700001B |2 |0.000 |0 |0.00000000 | |21 | << eliminar toda la fila
Son demasiadas líneas lo que necesito es checar línea por línea, las líneas que se tienen que chequear tienen esta sintaxis.
<numero1> |<numero2> |<string1> |<numero3> |<numero4> |<string2> |<numero5> |0.00 |0.00 |0.00 | | |
ó
<numero1> |<numero2> |<string1> |<numero3> |<numero4> |<string2> |<numero5> |0.000 |0 |0.00000000 | |<numero:11,12,21,22> |
ejemplo de que que se encesita tomar esas comparaciones y eliminar la fila3.
1:642926 |128 |C012644 |99 |3661351 |0160348B |2 |0.00 |0.00 |0.00 | | |
3:642926 |128 |C012644 |99 |3661351 |0160348B |2 |0.000 |0 |0.00000000 | |21 |
Lo que importa es encontrar duplicidad hasta el campo |<numero5> | y luego verificar si el siguiente numero es 0.000, entonces terminar la comparacion y eliminar toda la fila 3 y dejar la fila 1
otro ejemplo es : comparar linea 15 y linea 17
15.643043 |128 |C010278 |99 |3662001 |4700001b |2 |0.00 |0.00 |0.00 | | |
17.643043 |128 |C010278 |99 |3662003 |4700001B |2 |0.000 |0 |0.00000000 | |21 |
linea 15 y linea 17:
643043 |128 |C010278 |99 |3662003 |4700001B |2 <<< comparar hasta acá
Seguir con la opción 1 u opción 2
Opción 1:En la línea 17 buscar si si el siguiente carácter es un numero " |0.000 |" entonces eliminar toda esa fila sin dejar fila en blanco
Opción 2:En la línea 17 si en el último campo se encuentra un numero |<numero:11,12,21,22> | entonces eliminar toda esa fila sin dejar fila en blanco .Luego el archivo terminaría así:
642926  |128 |C012644 |99 |3661351 |0160348B |2 |0.00 |0.00 |0.00 | | |
642926  |128 |C012644 |99 |3661352 |0160348 |6 |1.533 |0 |9.19800000 | |21 |
642949  |128 |C010241 |99 |3661485 |84155616B |2 |0.00 |0.00 |0.00 | | |
642949  |128 |C010241 |99 |3661486 |84154530 |4 |4.025 |0 |16.10000000 | |21 |
642949  |128 |C010241 |99 |3661487 |575427 |2 |4.025 |0 |8.05000000 | |21 |
642949  |128 |C010241 |99 |3661488 |0160348B |2 |0.00 |0.00 |0.00 | | |
642949  |128 |C010241 |99 |3661489 |0160348 |6 |1.533 |0 |9.19800000 | |21 |
642949  |128 |C010241 |99 |3661491 |0070181 |1 |27.254 |0 |27.25400000 | |11 |
642950  |128 |C010241 |99 |3661492 |101032 |1 |46.900 |0 |46.90000000 | |31 |
642980  |128 |C014433 |99 |3661655 |0040232B |1 |0.00 |0.00 |0.00 | | |
642980  |128 |C014433 |99 |3661656 |0040232 |2 |20.246 |0 |40.49200000 | |21 |
643043  |128 |C010278 |99 |3662001 |4700001b |2 |0.00 |0.00 |0.00 | | |
643043  |128 |C010278 |99 |3662002 |4700001 |1 |8.474 |0 |8.47400000 | |21 |
Gracias y saludos desde PERÚ. Nota: en la comparación no importa mayúsculas con minúsculas.

2 Respuestas

Respuesta
1

<número4>

Si perdón ese campo es un campo que siempre va en aumento línea a línea se tiene que obviar esa comparación

******

otro ejemplo es : comparar linea 15 y linea 17
15.643043 |128 |C010278 |99 |3662001 |4700001b |2 |0.00 |0.00 |0.00 | | |
17.643043 |128 |C010278 |99 |3662003 |4700001B |2 |0.000 |0 |0.00000000 | |21 |

643043 |128 |C010278 |99 |3662003 |4700001B |2 <<< comparar hasta acá obviando |<número4>

Luego Seguir con la opción 1 u opción 2

Opción 1:luego de comparar hasta acá ; En la línea 17 buscar si si el siguiente carácter es un numero " |0.000 |" ( ese valor como string con 3 ceros luego del punto decimal que es diferente a encontrar un " |0.00 |" porque tiene solo tiene 2 ceros luego del punto decimal ) entonces si es cierto eliminar toda esa fila sin dejar fila en blanco
Opción 2:luego de comparar hasta acá ;En la línea 17 si en el último campo se encuentra un numero |<numero:11,12,21,22> | entonces eliminar toda esa fila sin dejar fila en blanco .Luego el archivo terminaría así:

******

Un favor ahora necesito lo siguiente si no fuera mucha molestia.
Archivo inicial:
655428 | 33 | C011548 | 99 | 3737911 | 0160247E | 1 | 0.00 | 0.00 | 0.00 |  |  |
655428 | 33 | C011548 | 99 | 3737912 | 0160340 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
655428 | 33 | C011548 | 99 | 3737913 | 0160247E | 1 | 0.00 | 0.00 | 0.00 |  |  |
655428 | 33 | C011548 | 99 | 3737914 | 0160222 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
655428 | 33 | C011548 | 99 | 3737915 | 0160247E | 1 | 0.00 | 0.00 | 0.00 |  |  |
655428 | 33 | C011548 | 99 | 3737916 | 0160215 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
655428 | 33 | C011548 | 99 | 3737917 | 0160264 | 3 | 0.000 | 0 | 0.00000000 |  | 21 |
655458 | 33 | C110405 | 99 | 3738060 | 0070006 | 1 | 11.788 | 0 | 11.78800000 |  | 21 |
655458 | 33 | C110405 | 99 | 3738061 | 0070043 | 1 | 14.322 | 0 | 14.32200000 |  | 21 |
archivo enumerado:
1.655428 | 33 | C011548 | 99 | 3737911 | 0160247E | 1 | 0.00 | 0.00 | 0.00 |  |  |  
2.655428 | 33 | C011548 | 99 | 3737912 | 0160340 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
3.655428 | 33 | C011548 | 99 | 3737913 | 0160247E | 1 | 0.00 | 0.00 | 0.00 |  |  |
4.655428 | 33 | C011548 | 99 | 3737914 | 0160222 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
5.655428 | 33 | C011548 | 99 | 3737915 | 0160247E | 1 | 0.00 | 0.00 | 0.00 |  |  |
6.655428 | 33 | C011548 | 99 | 3737916 | 0160215 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
7.655428 | 33 | C011548 | 99 | 3737917 | 0160264 | 3 | 0.000 | 0 | 0.00000000 |  | 21 |
8.655458 | 33 | C110405 | 99 | 3738060 | 0070006 | 1 | 11.788 | 0 | 11.78800000 |  | 21 |
9.655458 | 33 | C110405 | 99 | 3738061 | 0070043 | 1 | 14.322 | 0 | 14.32200000 |  | 21 |
sintaxis:
<numero1>  | <numero2>  | <string1>  | <numero3>  | <numero4>  | <string2>  | <numero5>  | 0.00  | 0.00  | 0.00  |   |   |
buscar cadenas iguales obviando <numero4> eliminar las cadenas y dejar una y solo una ademas sumar los valores numericos de las cadenas encontradas en <numero5>, en el ejemplo la linea 1, linea3 y linea 4
son iguales entonces sumar los valores en <numero5> : 1 + 1 + 1 = 3
luego la suma de <numero5> = 3 ubicar el valor en la linea 1 y eliminar las demas lineas (linea 3 y linea 4)
1.655428 | 33 | C011548 | 99 | 3737911 | 0160247E | 3 | 0.00 | 0.00 | 0.00 |  |  |  
2.655428 | 33 | C011548 | 99 | 3737912 | 0160340 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
4.655428 | 33 | C011548 | 99 | 3737914 | 0160222 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
6.655428 | 33 | C011548 | 99 | 3737916 | 0160215 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
7.655428 | 33 | C011548 | 99 | 3737917 | 0160264 | 3 | 0.000 | 0 | 0.00000000 |  | 21 |
8.655458 | 33 | C110405 | 99 | 3738060 | 0070006 | 1 | 11.788 | 0 | 11.78800000 |  | 21 |
9.655458 | 33 | C110405 | 99 | 3738061 | 0070043 | 1 | 14.322 | 0 | 14.32200000 |  | 21 |
luego el archivo final seria
655428 | 33 | C011548 | 99 | 3737911 | 0160247E | 3 | 0.00 | 0.00 | 0.00 |  |  |
655428 | 33 | C011548 | 99 | 3737912 | 0160340 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
655428 | 33 | C011548 | 99 | 3737914 | 0160222 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
655428 | 33 | C011548 | 99 | 3737916 | 0160215 | 12 | 2.067 | 0 | 24.80400000 |  | 21 |
655428 | 33 | C011548 | 99 | 3737917 | 0160264 | 3 | 0.000 | 0 | 0.00000000 |  | 21 |
655458 | 33 | C110405 | 99 | 3738060 | 0070006 | 1 | 11.788 | 0 | 11.78800000 |  | 21 |
655458 | 33 | C110405 | 99 | 3738061 | 0070043 | 1 | 14.322 | 0 | 14.32200000 |  | 21 |

Gracias de antemano

Si se pudiera hacer esta comprobación en una macro aparte o antes de aplicar la macro que me proporciono Respuesta de Dante Amor, aplicar esta comprobación.

Respuesta
1

En tu ejemplo de la fila 15 y 17

En el <número4> en al fila 15 tienes:

3662001

Y en la fila 17 tienes:

3662003

Entonces ya no son iguales, sin embargo, tu comentario es borrar la fila 17, es un error, o podrías explicarme si comparo todo esto:

"

643043 |128 |C010278 |99 |3662003 |4700001B |2 <<< comparar hasta acá

"

Lo mismo para los otros ejemplos, el único donde todos los campos son iguales, es el primer ejemplo.


Tampoco entendí la opción 2:

"

En la línea 17 si en el último campo se encuentra un numero |<numero:11,12,21,22> | entonces eliminar toda esa fila sin dejar fila en blanco

"

La opción 1, me queda clara, comparo los campos, si son iguales y el siguiente campo es un 0, entonces borro la fila.

Pero la opción 2, no dice si debo comparar, solamente borro si hay un número: 11,12,21,22, pero en tu ejemplo, hay otras filas que tienen 21 pero no las borras, por eso ya no entendí.

Podrías aclarar.

Revisando la información, ninguno de tus ejemplos se cumple, porque el campo número4 es diferente en todos los registros.

Podrías revisar si los datos son correctos.

Sigo sin entender la opción 2.

Quieres que además de comparar el campo 8, si es igual a 0 y si además el último campo contiene alguno de los números 11,12,21,22, ¿entonces borre la línea?

Si es correcto lo anterior prueba con la siguiente macro.

Sub Eliminar_Duplicados_En_Txt()
'---
'   Por.Dante Amor
'---
    '
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    '
    Set l1 = ThisWorkbook
    Set h1 = l1.Sheets("Hoja1")
    Set h2 = l1.Sheets("Hoja2")
    h1.Cells.Clear
    h2.Cells.Clear
    '
    ruta = l1.Path & "\"
    arch = "descarga_2017"
    '
    Workbooks.OpenText Filename:=ruta & arch & ".txt", _
        Origin:=xlMSDOS, _
        StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlNone, _
        ConsecutiveDelimiter:=False, Tab:=False, Semicolon:=False, _
        Comma:=False, Space:=False, Other:=True, OtherChar:="|", _
        FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2), Array(4, 1), _
        Array(5, 1), Array(6, 2), Array(7, 1), Array(8, 1), Array(9, 1), _
        Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1)), _
        TrailingMinusNumbers:=True
    Set l2 = ActiveWorkbook
    Set h3 = l2.Sheets(1)
    h3.Cells.Copy h1.Range("A1")
    l2.Close False
    '
    Workbooks.OpenText Filename:=ruta & arch, _
        Origin:=xlMSDOS, _
        StartRow:=1, DataType:=xlFixedWidth, _
        FieldInfo:=Array(0, 1), _
        TrailingMinusNumbers:=True
    Set l2 = ActiveWorkbook
    Set h3 = l2.Sheets(1)
    h3.Cells.Copy h2.Range("A1")
    l2.Close False
    '
    With h1.Range("N1:N" & h1.Range("A" & Rows.Count).End(xlUp).Row)
        .FormulaR1C1 = "=RC[-13]&RC[-12]&RC[-11]&RC[-10]&RC[-8]&RC[-7]"
        .Value = .Value
    End With
    '
    For i = h1.Range("N" & Rows.Count).End(xlUp).Row To 2 Step -1
        fila = 0
        If h1.Cells(i, "H") = 0 Then
            Select Case h1.Cells(i, "L")
                Case 11, 12, 21, 22: fila = i
            End Select
        End If
        If fila > 0 Then
            cuenta = WorksheetFunction.CountIf(h1.Range("N1:N" & i), h1.Cells(i, "N"))
            If cuenta > 1 Then
                h2.Rows(i).Delete
            End If
        End If
    Next
    '
    h2.Copy
    ActiveWorkbook.SaveAs Filename:=ruta & arch & "_a.txt", _
        FileFormat:=xlTextMSDOS, CreateBackup:=False
    ActiveWorkbook.Close
    '
    MsgBox "Archivo creado"
End Sub

Sigue las Instrucciones para un botón y ejecutar la macro

  1. Abre tu libro de Excel
  2. Para abrir Vba-macros y poder pegar la macro, Presiona Alt + F11
  3. En el menú elige Insertar / Módulo
  4. En el panel del lado derecho copia la macro
  5. Ahora para crear un botón, puedes hacer lo siguiente:
  6. Inserta una imagen en tu libro, elige del menú Insertar / Imagen / Autoformas
  7. Elige una imagen y con el Mouse, dentro de tu hoja, presiona click y arrastra el Mouse para hacer grande la imagen.
  8. Una vez que insertaste la imagen en tu hoja, dale click derecho dentro de la imagen y selecciona: Tamaño y Propiedades. En la ventana que se abre selecciona la pestaña: Propiedades. Desmarca la opción “Imprimir Objeto”. Presiona “Cerrar”
  9. Vuelve a presionar click derecho dentro de la imagen y ahora selecciona: Asignar macro. Selecciona: Eliminar_Duplicados_En_Txt
  10. Aceptar.
  11. Para ejecutarla dale click a la imagen.

Funciona de la siguiente manera:

  1. En un archivo nuevo creas 2 hojas "Hoja1" y "Hoja2"
  2. Pon el botón en la Hoja1
  3. Guardar el archivo con la macro como: Libro de Excel Habilitado para Macros.
  4. En la misma carpeta pones tu archivo "descarga_2017.txt"
  5. Al finalizar la macro te va a crear un nuevo archivo llamado "descarga_2017_a.txt", con el resultado.

.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas