Ayuda en código vbscript

Iniciado por eddergui, 22 Enero 2016, 00:11 AM

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

eddergui

Buenas noches estimados;

El propósito de mi código es que genere 5 copias de un archivo .dat indexados del 1 al 5, el cual les muestro a continuación:

Código (vb) [Seleccionar]
Dim counter as integer
Dim objfso, archivotexto, s, writefile
Dim file_Name as string

counter = 1

Do until counter =5

set objfso = createobject("scripting.filesystemobject")
Set archivotexto = objfso.opentextfile(".\Edificio2DA.dat",1)
s = archivotexto.readline

file_Name=".\"&counter&".dat"
set writefile = objfso.CreateTextFilefile_Name, True)
writefile.Write("s")
writefile.Close

set objfso=nothing
counter=counter+1

Loop



El problema es que al ejecutar me sale un error de compilación, les agradezco sus comentarios y sugerencias.

, saludos

_TTFH_3500

#1
Primero, si vas a hacer una iteracion una cantidad de veces determinada -en este caso 5- usa FOR, porque while y until se usan cuando na sabes cuantas veces debes iterar, por ejemplo mientras se cumple algo intentar de nuevo.

No uses lo de copiar el contenido de un archivo a otro nuevo y menos en el caso de que no sean archivos de texto ya que se puede dañar el contenido por un error de codificacion.

Y por ultimo no uses SET dentro de una iteracion si ya lo tienes definido.

Código (vb) [Seleccionar]

Option Explicit
Dim counter, fso, File

Set fso = CreateObject("Scripting.FileSystemObject")
Set File = fso.GetFile(".\Edificio2DA.dat")

For counter = 1 to 5
File.Copy (".\"&counter&".dat")
Next

eddergui

#2
Muchas gracias _TTFH_3500, me queda la duda en que no se pueda utilizar el "set" dentro de una iteración, por ejemplo si quiero sobreescribir cada archivo.dat de una carpeta reemplazando su contenido cada vez que pasa a leer el siguiente archivo.dat, estaría forzado a usar "For Each File in Files end" y la declaración "set", por ejemplo si quiero salvar el resultado de la función "nreemplazo=reemplazo(file,string)" necesito declarar "set NewFile =FSO.CreateTextFile("./ archivo.dat", true)" y luego "NewFile.Write nreemplazo" para poder sobreescribir en el "archivo.dat".

Estuve intentando hacer esto pero no me funciona, donde he declarado un array que contenga los números objetivos que van a reemplazar "0.03125" cada vez que lo encuentre dentro de los archivos.dat  y este resultado se sobrescriba en el mismo archivo.dat.

Código (vb) [Seleccionar]
arreglo = Array(Null, 0.03125, 0.0625, 0.09375, 0.125, 0.15625)
counter=0

Set FSO   = CreateObject("Scripting.FileSystemObject")
Set Files = FSO.GetFolder(".\").Files

For Each File in Files
Set Tfile=FSO.getfile(File)

counter=counter+1
s=arreglo(counter)

nreemplazo=reemplazo(Tfile, s)

Set NewFile  =FSO.CreateTextFile(".\"&"Edificio2DA"&counter&".dat", True)
NewFile.Write nreemplazo
NewFile.Close
Next

function reemplazo(TextFile, num)

TextContent = CreateObject("Scripting.FileSystemObject"). _
 OpenTextFile(TextFile, 1, False).ReadAll
 
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global  = True
objRegEx.Pattern  = "0.03125"  
Reemplazo = objRegEx.Replace(TextContent, num)

end function


Gracias de antemano por sus comentarios y sugerencias
, saludos!

_TTFH_3500

A lo que me refería con lo de SET es no definir varias veces algo como:
Código (vb) [Seleccionar]
Set FSO  = CreateObject("Scripting.FileSystemObject")
o similar y ponerlo fuera de la iteración, pero si usas SET para modificar el valor de una variable por uno distinto esta bien.

Código (vb) [Seleccionar]
Set NewFile  =FSO.CreateTextFile(".\"&"Edificio2DA"&counter&".dat", True)

eddergui


Gracias _TTFH_3500, me quedó claro.

Les agradecería me puedan sugerir que podría hacer para resolver el problema que plantee en:
Cita de: eddergui en 22 Enero 2016, 16:44 PM

, saludos!


eddergui

Buenas tardes:

He estado intentando resolver el problema de reemplazar el string="0.03125" dentro de cada "archivo.dat" con cada contenido del arreglo=Array(Null, "0.03125", "0.0625", "0.09375", "0.125", "0.15625"). Por ejemplo:

1.- En el archivo: Edificio2DA1 buscar dentro de este un string="0.03125" y reemplazar por "0.03125".
2.- En el archivo: Edificio2DA2 buscar dentro de este un string="0.03125" y reemplazar por "0.0625"
3.- En el archivo: Edificio2DA3 buscar dentro de este un string="0.03125" y reemplazar por "0.09375"
4.- En el archivo: Edificio2DA4 buscar dentro de este un string="0.03125" y reemplazar por "0.125"
5.- En el archivo: Edificio2DA5 buscar dentro de este un string="0.03125" y reemplazar por "0.15625"

Me ha funcionado solo para un archivo, pero luego cuando hice las modificaciones como por ejemplo agregarle el bucle, me arroja el error: Ruta de acceso no encontrada, al momento de ejecutar.

El código que trabajé es el siguiente, le agregué comentarios:

Código (vb) [Seleccionar]
arreglo = Array(Null, "0.03125", "0.0625", "0.09375", "0.125", "0.15625")
counter=0

Set FSO   = CreateObject("Scripting.FileSystemObject")
Set Files = FSO.GetFolder(".\").Files

For Each File in Files

Set TFile = FSO.GetFile(".\"&File.name) 'Da el path del archivo File, ejm:C:\CarpetaP\CarpetaS\archivo.dat

if Lcase(FSO.GetExtensionName(File))=Lcase("dat") then ' Condicional solo para  hacer la búsqueda de archivos con extensión.dat

counter=counter+1 'contador aumenta cada vez que lee un archivo File
s=arreglo(counter)'toma el string correspondiente a la posición "counter" del "arreglo".

nreemplazo=reemplazo(TFile, s) 'resultado de la función de reemplazo, donde si encuentra un "string=0.03125" hace el correspondiente cambio con el "string=s".
Set NewFile  =FSO.CreateTextFile(".\"&"Edificio2DA"&counter&".dat", True) 'crea un archivo nuevo con el mismo nombre del archivo "File"
NewFile.Write nreemplazo 'Sobreescribe el resultado de la función de reemplazo en el nuevo File creado en el paso anterior.
NewFile.Close

end if
Next

function reemplazo(TextFile, num)

TextContent = CreateObject("Scripting.FileSystemObject"). _
  OpenTextFile(TextFile, 1, False).ReadAll
 
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global  = True
objRegEx.Pattern  = "0.03125"  
Reemplazo = objRegEx.Replace(TextContent, num)

end function


Como siempre les agradezco sus comenterios y sugerencias,

saludos!

eddergui

Buenas tardes estimados:

Logré solucionar el problema con este código:

Código (vb) [Seleccionar]
arreglo = Array(Null, "0.03125", "0.0625", "0.09375", "0.125", "0.15625")
arreglotxt = Array(Null, ".\Edificio2DA1.dat", ".\Edificio2DA2.dat", ".\Edificio2DA3.dat", ".\Edificio2DA4.dat", ".\Edificio2DA5.dat")
counter=0

Set FSO   = CreateObject("Scripting.FileSystemObject")
Set Files = FSO.GetFolder(".\").Files

For counter=1 to 5

TFile=arreglotxt(counter)
s=arreglo(counter)'toma el string correspondiente a la posición "counter" del "arreglo".

nreemplazo=reemplazo(TFile, s) 'resultado de la función de reemplazo, donde si encuentra un "string=0.03125" hace el correspondiente cambio con el "string=s".
Set NewFile  =FSO.CreateTextFile(".\"&"Edificio2DA"&counter&".dat", True) 'crea un archivo nuevo con el mismo nombre del archivo "File"
NewFile.Write nreemplazo 'Sobreescribe el resultado de la función de reemplazo en el nuevo File creado en el paso anterior.
NewFile.Close

Next

function reemplazo(TextFile, num)

TextContent = CreateObject("Scripting.FileSystemObject"). _
  OpenTextFile(TextFile, 1, False).ReadAll
 
Set objRegEx = CreateObject("VBScript.RegExp")
objRegEx.Global  = True
objRegEx.Pattern  = "0.03125"  
Reemplazo = objRegEx.Replace(TextContent, num)

end function


Si alguien puede optimizarlo mejor, sería genial,

Saludos!