ayuda con pequeño script

Iniciado por ramos_45, 26 Septiembre 2018, 22:51 PM

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

ramos_45

Buenas a todos.

Hace años estuve registrado en este foro pero por algún motivo , tal vez inactividad , mi cuenta no existía.

El motivo de este post, es para ver si algún gurú me podría hacer un script muy simple, ya que yo desconzco de programacion, aunque soy capaz de editar algo de codigo.explicó el caso.

Tengo unos documentos txt de gcode(programación cnc) los cuales llevan diferentes líneas.
En cada línea lleva un código de grupo,por ejemplo un sería DMN_101. En medio de la línea.

Necesito eliminar completamente las líneas que contengan diversos códigos de estos que yo le asigne, y que el resto las dejé intactas, es decir, en el siguiente ejemplo:

Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx

Si yo quisiera eliminar las UAN_202 y UIU_111, simplemente me dejara las 2 líneas con DMN_101 y me creara otro txt con el nombre "FILTRADO (nombre original).txt) a poder ser


Espero haberme explicado, un saludo

EdePC

Saludos,

- En la Command Line de Windows (cmd) puedes utilizar el comando FIND con el modificador /v para que imprima las líneas que NO contengan la palabra buscada, y opcionalmente utilizar /i para no distinguir mayúsculas de minúsculas:

Código (bash) [Seleccionar]
copy con doc.txt
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx^Z
        1 archivo(s) copiado(s).

type doc.txt
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx

find /v /i "UAN_202" doc.txt | find /v /i "UIU_111" > FILTRADO_doc.txt

type FILTRADO_doc.txt

---------- DOC.TXT
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx

nokia-6260

Así sin mirar mucho y con esto de aprender un poco de python hice este script , según mis pruebas funciona, aunque seguro que se puede hacer mil veces mejor.
Saludos.

#!/usr/bin/env python

file_r = open("Tu_home/sin_filtrar.txt",'r')
file_w = open("/Tu_home/filtrado.txt", 'w')

lines = file_r.readlines()

for i in lines:
    print(i)
    resul_UAN_202 = i.find('UAN_202')
    resul_UIU_111 = i.find('UIU_111')
    if ((resul_UAN_202 > 0) or  (resul_UIU_111 >0)):
        print("borrar")
    else:
        file_w.write(i)   
print(lines)       

animanegra

Si es solo eliminar las lineas que cumplan un patron puedes tambien simplemente usar grep que para eso está:

Citar

cat fichero_de_entrada | grep -v "patron_a_quitar_1\|patron_a_quitar_2\|patron_a_quitar_3" > fichero_de_salida


Saludos.

42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.

ramos_45

Gracias por vuestras respuestas!

Cita de: EdePC en 27 Septiembre 2018, 02:20 AM
Saludos,

- En la Command Line de Windows (cmd) puedes utilizar el comando FIND con el modificador /v para que imprima las líneas que NO contengan la palabra buscada, y opcionalmente utilizar /i para no distinguir mayúsculas de minúsculas:

Código (bash) [Seleccionar]
copy con doc.txt
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx^Z
        1 archivo(s) copiado(s).

type doc.txt
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx

find /v /i "UAN_202" doc.txt | find /v /i "UIU_111" > FILTRADO_doc.txt

type FILTRADO_doc.txt

---------- DOC.TXT
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx



Entiendo que con ese codigo solo usarías las líneas 1,8,14y 16 no? El resto que pones es lo que respondería.

Los tengo muchos códigos que copiar para eliminar, unos 80,y posteriormente tal vez tenga que añadir más. Este script yo sabría modificarlo y añadirlos, pero lo van a usar otras personas que no. Habría la posibilidad de al inicio crear un menú que te pregunte si quieres añadir o quitar códigos?

Se podría simplificar la línea:
find /v /i "UAN_202" doc.txt | find /v /i "UIU_111" >

Para no tener que poner así los 80 códigos?


ramos_45

Cita de: nokia-6260 en 27 Septiembre 2018, 02:41 AM
Así sin mirar mucho y con esto de aprender un poco de python hice este script , según mis pruebas funciona, aunque seguro que se puede hacer mil veces mejor.
Saludos.

#!/usr/bin/env python

file_r = open("Tu_home/sin_filtrar.txt",'r')
file_w = open("/Tu_home/filtrado.txt", 'w')

lines = file_r.readlines()

for i in lines:
    print(i)



    resul_UAN_202 = i.find('UAN_202')
    resul_UIU_111 = i.find('UIU_111')
    if ((resul_UAN_202 > 0) or  (resul_UIU_111 >0)):
        print("borrar")
    else:
        file_w.write(i)   
print(lines)       



Muchas gracias, yo creo que sí. En batch se crearlo, pero como lo copió y ejecutó para phyton?

ramos_45

Cita de: animanegra en 27 Septiembre 2018, 10:24 AM
Si es solo eliminar las lineas que cumplan un patron puedes tambien simplemente usar grep que para eso está:

Saludos.


Sería ideal pero lo necesito para Windows

ramos_45

#7
Gracias por vuestras respuestas y vuestra ayuda.

Se podría añadir el documento arrastrando?

Se me a ocurrido otra opción que me ayudaría mucho, y sería resaltar en colores cuando encuentre diversas cosas. Por ejemplo:

Xxxxxxxxx DMN_101. XxxxxxM03xx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxM00xxx


Cuando encuentre M03, me lo pinte de verde y cuando encuentre M03 me lo pinte de rojo

Obviamente, tendría que ser en la consola, pero me gustaría también que exportará como hemos dicho antes(aunque aquí no pueda tener colores)

**Aincrad**

#8
1) No hagas doble o mas post seguidamente, lee las reglas.




Cita de: ramos_45 en 27 Septiembre 2018, 11:33 AM

Se podría añadir el documento arrastrando?


Esto solo lo permite la CMD a partir de Windows 7. aquí te dejo un ejemplo:

Código (bash) [Seleccionar]
@echo off
goto menu
:err
echo Error :v . & pause & goto menu

:continue
echo tu archivo es %op%
pause & exit


:menu
cls
echo/
echo introduzca el directorio del archivo / o Arrastre.
echo/
set /p op= --------------- :
if not defined op (goto:menu) >NUL
if not exist %op% (goto:err) >NUL
goto continue



Cita de: ramos_45 en 27 Septiembre 2018, 11:33 AM

Se me a ocurrido otra opción que me ayudaría mucho, y sería resaltar en colores cuando encuentre diversas cosas. Por ejemplo:

Xxxxxxxxx DMN_101. XxxxxxM03xx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxM00xxx


Cuando encuentre M03, me lo pinte de verde y cuando encuentre M03 me lo pinte de rojo


Ya esto no lo vas a lograr con batch.




EdePC

- Gracias a FINDSTR puedes hacer uso de un fichero aparte que contenga todas las palabras que quieres filtrar:

Código (bash) [Seleccionar]
C:\Users\EdSon\Desktop>type doc.txt
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx UAN_202 xxxxxxxxx
Xxxxxxxxx UIU_111 xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx

C:\Users\EdSon\Desktop>type filtro.txt
UAN_202
UIU_111

C:\Users\EdSon\Desktop>findstr /v /i /g:filtro.txt doc.txt
Xxxxxxxxx DMN_101. Xxxxxxxxx
Xxxxxxxxx DMN_101xxxxxxxxx





- Puedes crear un fichero .bat (o .cmd) para utilizar el código que ha compartido **Aincrad** y en lugar de poner:

Código (bash) [Seleccionar]
echo tu archivo es %op%

-- pondrías:

Código (bash) [Seleccionar]
findstr /v /i /g:filtro.txt %op% > FILTRADO_%op%

-- No te olvides del fichero filtro.txt donde están las palabras a filtrar. Si el script encuentra dicha palabra en una línea elimina toda esa línea.




- Colorear en CMD si es posible pero no muy práctico, se puede utilizar el mismo FINDSTR con el modificador /A, el detalle es que solo colorea los nombres de los ficheros que contienen la palabra a buscar, por ende se tendría que crear tantos ficheros como líneas haya en tu fichero doc.txt