QPF to Chapter file

Iniciado por ovichan, 12 Julio 2013, 05:48 AM

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

ovichan

#10
Me sabe mal pero te voy a martirizar. Estoy intentando ir por pasitos. Entonces lo que estoy intentando lo primero es abrir el archivo qpf tal que asi:

Código (vb) [Seleccionar]
'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
Set objfso = createobject("scripting.filesystemobject")

set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
msgbox qpfile.readline


Esto funciona, lo muestra en pantalla pero claro lo que quiero que me guarde esa linea en una variable y hacer el filtrado por tokenks como has indicado. Ademas la lectura por lineas creo que deberia usarlo con un for, hasta el final del archivo. Algo quizas como:

Código (vb) [Seleccionar]
Do until ARCHIVO FINALICE
 Procedimiento anterior
Loop until


La condicion ARCHIVO FINALICE imagino que respondera a algun metodo del objeto del archivo de texto. ¿Cuál es?

Siento ser tan cansino. ¬¬'

EDITO: He intentado esto pero algo va mal

EDITO2: Esta parte resuelta

Código (vb) [Seleccionar]
'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
Set objfso = createobject("scripting.filesystemobject")
dim linea

set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
linea=qpfile.readline()
msgbox(linea)

'qpfile.copyline(linea)


Hay que ser cafre que estaba intentando meter un string en un objeto. Esto de los objetos siempre me costo entenderlo.... y ya en java con los constructores ni te digo.

Eleкtro

#11
Código (vb) [Seleccionar]
set qpfile=createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)

Do until qpfile.AtEndOfStream
linea=qpfile.readline()
' o msgbox(qpfile.readline())
Loop


saludos








ovichan

Por ahora, voy asi... pero por hoy no puedo dedicarle mas tiempo que tengo que sincronizar mas cosas:

Código (Vb) [Seleccionar]
'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
Set objfso = createobject("scripting.filesystemobject")
dim linea
dim numero
dim constante

constante=0,0417083

'do
set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
linea=qpfile.readline()

'Filtrar linea, para quedarnos con el numero del frame
For each token in split(linea, " ")
    numero=token
exit For
next

msgbox(numero)

'loop until qpfile.AtEndOfStream = true


Ahora debo aplicar el algoritmo de conversion. ¿Se puede hacer como en dos, crear una etiqueta (procedimiento) desde el interior del bucle??

No se algo como:

Function Conversion (string x){}

Eleкtro

#13
Cita de: ovichan en 12 Julio 2013, 19:49 PM¿Se puede hacer como en dos, crear una etiqueta (procedimiento) desde el interior del bucle??

Cualquier cosa que haga Batch se puede hacer en otro lenguaje, y mejor xD :

Código (vb) [Seleccionar]
Set   TextFile = createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
Const Constant = 0.0417083

Do Until TextFile.AtEndOfStream

For Each Token in split(TextFile.readline()) ' Te hago saber que por defecto un token es separado por un "espacio".
       Tratar(Token)
Next
 
Loop

Wscript.quit

Sub Tratar(Token)
MsgBox(Token)
End Sub








ovichan

Buenas otra vez, como tengo que saltar una linea del archivo de texto al que se invoca, mi pregunta es si puedo usar el otro tipo de FOR, con indice y a su vez, usar la opcion de split.

Mi codigo por ahora va asi:

Código (vb) [Seleccionar]
'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
Set objfso = createobject("scripting.filesystemobject")

'Definicion de variables
dim linea
dim numero
const constante = 0.0417083

'do until qpfile.AtEndOfStream

set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
linea=qpfile.readline()

'Filtrar linea, para quedarnos con el numero del frame
For each token in split(linea, " ")
    Tratar(token)
exit For
next

'loop

Wscript.quit

Sub Tratar(Token)
'Mensaje de error
IF (token >= 216000) THEN

msgbox("Error. Un video no puede tener una duracion continua igual a un o mas días.")

ELSE
'Calculo de timecodes partiendo de horas
IF (token >= 3600) THEN
msgbox("hola1")
ELSE
IF (token < 3600 AND token >= 60) THEN

msgbox("hola2")
ELSE
IF (token < 60 AND token >= 0) THEN

msgbox("hola3")
ELSE
msgbox("Error. No pueden existir valores negativos.")
END IF
END IF
END IF
END IF


End Sub

Eleкtro

#15
Si el problema es que necesitas saltar la primera línea del archivo pues ejecuta esta instrucción 2 veces:

Código (vb) [Seleccionar]
...

qpfile.readline() : linea=qpfile.readline() ' leemos dos lineas, pero nos quedamos con la segunda.

For each token in split(linea, " ") ...
...


EDITO: Si no es eso pues da más detalles... pero ten en cuenta antes de preguntar que puedes usar condicionales...

Código (vb) [Seleccionar]
if not "a" = "A" then   : Wscript.Echo "no" : end if
if Instr("a", "a") then : Wscript.Echo "si" : end if


Saludos








ovichan

#16
Si, era el primer caso que me has puesto pero cuando ejecute el bucle que aun no lo he probado pues estoy depurando el algoritmo, ejecutara cada ciclo con dos lineas.

Código (vb) [Seleccionar]
'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
Set objfso = createobject("scripting.filesystemobject")

'Definicion de variables
Dim linea
Dim token
Const constante = 0.0417083


'do until qpfile.AtEndOfStream

set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
qpfile.readline() : linea=qpfile.readline()

'Filtrar linea, para quedarnos con el numero del frame
For each token in split(linea, " ")
    Tratar(token)
exit For
next

'loop

Wscript.quit

'Subrutina para transformar numero entero en timestamp
Sub Tratar(Token)
'Establecemos criterio de comparación
calculo=token*constante
p_entera= Cint(calculo)

'Mensaje de error
IF (p_entera >= 216000) THEN
hora=normalizar(calculo)
msgbox("Error. Un video no puede tener una duracion continua igual a un o mas días.")

ELSE
'Calculo de timecodes partiendo de horas
IF (p_entera >= 3600) THEN
msgbox("hola1")
ELSE 'Calculo de timecodes partiendo de minutos
IF (p_entera < 3600 AND p_entera >= 60) THEN

min=calculo\60
seg=calculo mod 60
ms=round(((((calculo/60)-min)*60)-seg),3)*1000
msgbox(min & " min. " & seg & " seg. " & ms & " ms. ")

ELSE 'Calculo de timecodes partiendo de segundos
IF (p_entera < 60 AND p_entera >= 0) THEN
msgbox("hola3")
ELSE
msgbox("Error. No pueden existir valores negativos.")
END IF
END IF
END IF
END IF
End Sub


EDITO: De todas maneras creo que hay un problema, pq al retorna a procedimientos principal no se si guarda correctamente los valores de las variables (hora, min, seg, ms). Y creo que no es un buen diseño depender de tantas variables generales, o al menos eso tenia entendido.

¿Más que un procedimiento, no debería ser una función?

EDITO2: Tengo un gran problema con el algoritmo, si fuerzo el valor de tokens=2633, el valor resultante no coincide con el que deberia puesto que automaticamente lo redondea. Me explico.

El frame 2633, tiene un timestamp igual a 01:49.818. Con el algoritmo que he puesto y otros que estoy probando, redondea los valores al inmediato superior. En este caso, los segundos los pasa a 50.

He probado con seg=FormatNumber((calculo/60-min)*60,0), y tambien lo redondea. Ñooooooo

Eleкtro

Cita de: ovichan en 13 Julio 2013, 03:05 AM¿Más que un procedimiento, no debería ser una función?

Vamos a ver, no veo que intentes retornar ningún valor ni que tengas planeado hacerlo en un futuro, tal y como lo estás haciendo vas bien, aunque yo lo haría todo dentro del For, pero usa un proc si sigues así ...usa una función si quieres tratar los valores fuera del bloque de la subrutina, en el Ciclo del For.

Óbviamente si deseas "tratar" las variables del proc fuera del proc primero tienes que declararlas...

Código (vb) [Seleccionar]
dim hora

sub blabla
   hora = X
end sub

msgbox(hora)


saludos








ovichan

Si, las habia declarado pero aun asi como el algoritmo para calcular los segundos, lo hice mediante el modulo, no se que pasa que no lo muestra en pantalla si hago un msgbox despues de haber llamado a la subrutina:

Código (vb) [Seleccionar]
For each token in split(linea, " ")
    Tratar(token)
msgbox(min & " min. " & seg & " seg. " & ms & " ms. ")


De todas maneras, ahora mismo el problema mas grande es que vbs me redondea automaticamente los valores de los resultados inmediatos a su numero entero superior, cosa que en mi caso, no es apropiado. ¿No puedo unicamente quedarme con la parte entera sin que me redondee?

Eleкtro

#19
Cita de: ovichan en 13 Julio 2013, 03:52 AMvbs me redondea automaticamente los valores de los resultados inmediatos a su numero entero superior

Es lo que hace la función "Cint", usa "Int" en su lugar.

Por cierto, podrías evitar el uso de if's anidados, no lo soporto, con lo bonito y organizado que queda un Case:

Código (vbnet) [Seleccionar]
' Variables
Const constante = 0.0417083

' Do until qpfile.AtEndOfStream

set qpfile=createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
qpfile.readline()

'Filtrar linea, para quedarnos con el numero del frame
For each token in split(qpfile.readline())
    tratar(token)
exit For
Next

' Loop

Wscript.quit

'Subrutina para transformar numero entero en timestamp
Sub Tratar(Frame)

'Establecemos criterio de comparación
calculo  = (Frame * constante)
p_entera = int(calculo)

Select Case p_entera

Case p_entera >= 216000 'Mensaje de error
hora=normalizar(calculo)
msgbox("Error. Un video no puede tener una duracion continua igual a un o mas días.")

Case p_entera >= 3600 'Calculo de timecodes partiendo de horas
msgbox("hola1")

Case p_entera < 3600 AND p_entera >= 60 ' Calculo de timecodes partiendo de minutos
min=calculo\60
seg=calculo mod 60
ms=round(((((calculo/60)-min)*60)-seg),3)*1000
msgbox(min & " min. " & seg & " seg. " & ms & " ms. ")

Case p_entera < 60 AND p_entera >= 0 'Calculo de timecodes partiendo de segundos
msgbox("hola3")

Case ELSE
msgbox("Error. No pueden existir valores negativos.")

End select

End Sub


PD: No lo he testeado, pero ya te haces una idea.

Saludos!