Comparar líneas VBS

Iniciado por Novlucker, 30 Junio 2008, 17:28 PM

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

Novlucker

Buenas, una vez más, estaba viendo la solución a uno de los problemas planteados en batch, en este caso es el de Shinseiki86, que quería comparar líneas en un archivo de texto, y que las que estuviesen repetidas, fueran volcadas a un otro archivo de texto a modo de registro....

En batch, esto puede resultar muy complicado, por no decir imposible (por lo que, ni me he complicado :rolleyes:), pero en *.vbs, esto resulta mucho más fácil..... así que he creado el siguiente script....

Este no solo revisa la línea siguiente, como planteaba Shinseiki86, sino que revisa todas y cada una de las líneas, por lo que, para un archivo de 3000 líneas(se planteaba en el caso original), el script realiza unas 4500000 comparaciones, en menos de un minuto (Pentium IV, 1 Gb de ram), una vez terminado, vuelca las líneas repetidas en un archivo (creado en los temporales) y lo ejecuta para su visualización.

Durante el proceso se verán mensajes del progreso (simples popup), los cuales avisaran cada 10%  :P

Esta la posibilidad de hacer un script más vistoso, en el cual, en lugar de los popup se muestre una barra de progreso creada en iexplorer, pero el kaspersky lo detecta como amenaza porque se intenta crear algo con el iexplorer  :¬¬

En definitiva.... este es el script  :P (creado en un rato de distracción en el curro XD)

set objfso = createobject("scripting.filesystemobject")
set objshell = createobject("wscript.shell")
set archivo = objfso.opentextfile("c:\origen.txt",1)

archivo.readall
lineast = archivo.line
archivo.close
upro = 0

for n = 1 to lineast - 1

set archivo = objfso.opentextfile("c:\origen.txt",1)

if n > 1 then
for e = 1 to n - 1
archivo.skipline
next
end if

lineaa = archivo.line
primeral = archivo.readline

for i = 1 to lineast - lineaa
segundal = archivo.readline
if segundal = primeral and instr(1,registro,segundal,1) = 0 then
registro = registro & segundal & ";"
exit for
end if
next

archivo.close
pro = int((100/lineast)*n)

if pro <> upro and int(pro/10) = (pro/10) then
progreso =  objshell.popup(pro & "%",1,"Progreso...")
objshell.AppActivate "Progreso..."
upro = pro
end if

next

set destino = objfso.createtextfile(objfso.getspecialfolder(2) & "\resultado.txt",true)
renglones = split(registro,";")

for each r in renglones
destino.writeline r
next

msgbox "Proceso terminado..."
objshell.run objfso.getspecialfolder(2) & "\resultado.txt"


El archivo de origen (el que tiene las líneas a compar) debe de estar en c:\origen.txt), como ejemplo, un archivo con el siguiente texto...

2008-06-19_590059_NI_890807898_EPS018_86_I.TXT
2008-06-19_621451_NI_890706425_EPS018_86_I.TXT
2008-06-19_621451_NI_890706425_EPS018_86_I.TXT
2008-06-19_621452_NI_890706425_EPS018_86_I.TXT
2008-06-19_621517_NI_810001583_EPS018_86_I.TXT
2008-06-20_102019121_CC_94487480_EPS018_51_I.TXT
2008-06-20_102019121_CC_94487480_EPS018_51_I.TXT
2008-06-20_102088573_CC_5931385_EPS018_01_I.TXT
2008-06-20_102718305_CC_33966379_EPS018_01_I.TXT
2008-06-20_102718305_CC_33966379_EPS018_01_I.TXT
2008-06-20_103000920_CC_31992855_EPS018_01_I.TXT
2008-06-20_103000920_CC_31992855_EPS018_01_I.TXT
2008-06-20_103161002_CC_16638978_EPS018_01_I.TXT

Arrojaría como resultados, un archivo con esto....

2008-06-19_621451_NI_890706425_EPS018_86_I.TXT
2008-06-20_102019121_CC_94487480_EPS018_51_I.TXT
2008-06-20_102718305_CC_33966379_EPS018_01_I.TXT
2008-06-20_103000920_CC_31992855_EPS018_01_I.TXT
(son los que se ven marcados en rojo arriba, y que en definitva están repetidos)

Bueno, eso es todo, en definitiva, un code más para que pueda servir como ejemplo, y quizás le sirva a Shinseiki86 ;D

Mensaje original donde se plantea la consulta

Saludos

P.D1: el code queda más legible si lo pongo entre etiquetas GeSHi, pero a la hora de copiar el code en el notepad se desordena todo  :¬¬

P.D2:También pongo este code por separado del original porque la consulta era en batch, y para no mezclar el post de Programación BATCH Avanzada. (nuevo) con *.vbs  :P
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein