QPF to Chapter file

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

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

ovichan

Hola buenas, estaba intentando hacer un conversor de archivos qpf files (que es un txt con otra extensión) para calcular una serie de codigos de tiempo en base a un numero prefijado de 23.976 frames por segundo.

El caso es que nada mas empezar no me ejecuta la tarea mas basica que es motrar en la consola las lineas del qpf. El código es este:

Código (dos) [Seleccionar]
@echo off
SetLocal EnableDelayEdexpansion

@ECHO OFF
FOR /F "tokens=*" %%A IN ("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt") DO CALL:Tratar "%%A"
GOTO:EOF

:Tratar
  SET Reg=%~1
  ECHO %Reg%
  GOTO:EOF

pause&exit


El formato de un archivo qpf es:

0 K -1
2616 K -1
16072 K -1
16384 K -1
32440 K -1
34768 K -1


Entonces necesito coger cada numero, tratarlo durante el proceso del for, calcular el codigo de tiempo, e ir almacenandolo en otro txt. El algoritmo sería algo como:

Codigo de tiempo=2616*0,0417083sg=109,1089128sg/60=1,81848188=1min+0,81848188

resto_tiempo=0,81848188*60=49,1089128sg=49sg+109ms

total 1min49sg109ms-->00:01:49.109

Tras calcular el primer resultado tendria que discenir si x>=3600 entonces el resultado que da seria en horas, si x>=60 daria en minutos, x<60 en segundos.

Vamos, pero que me gustaria saber pq no me lista los numeros. Tengo windows8, por si afecta en algo.

Eleкtro

#1
Cita de: ovichan en 12 Julio 2013, 05:48 AMme gustaria saber pq no me lista los numeros.

No estás usando comillas en el comando agrupado, no le estás indicando al FOR que se trata de un archivo, en lugar de eso estás usando comillas dobles así que estás leyendo interpretando un String "...\10. QPFILE_NAME.txt", no el contenido del archivo.

Hay dos formas de hacerlo, una es usando el parámetro "usebackq" del FOR y usar sólo comillas, y la otra es usando la sintaxis correcta del For agrupando un comando con comillas: ...In ('Type "archivo"') Do..., bueno, aquí tienes la sintaxis:

Citar FOR /F ["options"] %%parameter IN ('command_to_process') DO command

Citar      usebackq     Use the alternate quoting style:                        
                  - Use double quotes for long file names in "filenameset".
                  - Use single quotes for 'Text string to process'
                  - Use back quotes for `command_to_process`


Código (dos) [Seleccionar]
@echo off
SetLocal EnableDelayEdexpansion

FOR /F "usebackq delims=" %%A IN (
"C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt"
) DO (
SET "Reg=%%A"
ECHO !Reg!
)

Pause&Exit


Saludos








ovichan

#2
Vaya, que facil parece y que dolor de cabeza tenia ayer con esto. Gracias.

EDITO: Tengo este codigo pero se cierra el msdos y no puedo ver nada, aparentemente se ejecuta sin fallos.


EDITO2: Solucionado ^^

Código (dos) [Seleccionar]
@echo off
SetLocal EnableDelayEdexpansion

@ECHO OFF
FOR /F "usebackq tokens=1" %%A IN (
"C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt"
) DO (
call:timecode %%A

)
goto:finish

:timecode
SET /a Reg="%1"
echo %reg%
goto:eof

:finish
pause&exit

ovichan

Creo que la sintaxis es correcta pero me indica que le falta el operador WTF!!

Código (dos) [Seleccionar]
@echo off
Title QPFile to Chapter´s Timecodes

@ECHO OFF
For /f "usebackq tokens=1" %%A IN (
"C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt"
) DO (
call:timecode %%A

)
Goto:finish

:timecode
Set /a reg=%1
Echo %reg%
set /a const=0.0417083
set /a reg=%reg%*%const%
Echo %reg%

::Mensaje de error
IF %reg% GEQ 216000 (color 4E & echo Error. Un video no puede tener una duracion continua igual a un o mas días.)

::Calculo de timecodes partiendo de horas
IF %reg% GEQ 3600 (echo hola 1)

::Calculo de timecodes partiendo de minutos
IF %reg% LSS 3600 (IF %reg% GEQ 60 (echo hola 2))

::Calculo de timecodes partiendo de segundos.
IF %reg% LSS 60 (IF %reg% GEQ 0 (echo hola 3))
Pause
Goto:eof

:finish
Pause&exit


¿Algo está mal? ¿Acaso no se puede operar con numeros decimales?

Eleкtro

#4
Cita de: ovichan en 12 Julio 2013, 17:39 PM¿Algo está mal? ¿Acaso no se puede operar con numeros decimales?

Exacto, ese es el problema, Batch no soporta operaciones con decimales.

Aunque se pueden llegar a hacer, pero es un jaleo de código y porsupuesto no es algo "nativo" que digamos, diréctamente te recomiendo cualquier otro lenguaje.

Si no quieres depender de tener un intérprete instalado en el PC entonces te iría bien usar VBScript, javascript, O Powershell.

Saludos!








ovichan

Jeje me lo habia supuesto, estoy aprendiendo ahora a manejar vbscript, me suena de cuando en la facultad toque por encima el visualbasic... pero vamos que fue para importar tablas de excel y hace siglos de eso.... me mueroooooo  :silbar:

Eleкtro

#6
Cita de: ovichan en 12 Julio 2013, 18:08 PM
Jeje me lo habia supuesto, estoy aprendiendo ahora a manejar vbscript, me suena de cuando en la facultad toque por encima el visualbasic... pero vamos que fue para importar tablas de excel y hace siglos de eso.... me mueroooooo  :silbar:

No te preocupes, para lo que necesitas no tienes que aprender casi nada, sólo a usar los operadores aritméticos y escribir una rchivo de texto.

Ejemplo:

Código (vb) [Seleccionar]
num1 = 0.5
num2 = 2
Result = (num1 * num2)

Wscript.Echo(Result)

Set textfile = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\test.txt", 8, true)
textfile.Write(Result & vbCrLf) : textfile.Close

Wscript.Quit(0)


Saludos








ovichan

#7
Pues menos mal porque estaba haciendo esto y no me salia  :-[

Código (vb) [Seleccionar]
Dim valor
Valor1 = 0.0417083
Valor2=2616
valor=valor1*valor2

If  valor < 10 then
   "El valor es MENOR a diez "
Else
  document.write( "El valor es MAYOR a diez " & valor)
End if

ovichan

Se puede hacer un filtrado por tokens de un for de dos, en vbs??

Eleкtro

Cita de: ovichan en 12 Julio 2013, 18:42 PM
Se puede hacer un filtrado por tokens de un for de dos, en vbs??

Código (vb) [Seleccionar]
str = "a-b-c-d-e-f"

For each token in split(str, "-")
   wscript.echo(token)
next


Saludos