En Windows Xp Sp3
Partiendo de:
Fichero1.txt
Fichero2.txt
Fichero3.txt
Con contenido de tipo y solo una sola linea por fichero como muestra el ejemplo
Fichero1.txt
asdadasdasdasd asdsadas asdasdasd cash out: 1.97 asdasdas asdasda
Fichero2.txt
asdadasdasdasd asdsadas asdasdasd cash out: 212.34 asdasdas asdasda
Fichero3.txt
asdadasdasdasd asdsadas asdasdasd cash out: 1232.97 asdasdas asdasda
Como seria un bat o vbs que como resultado diera un fichero
Fichero4.txt
Con contenido:
cash out: 1.97
cash out: 212.34
cash out: 1232.97
Alguna recomendación, tengo conocimientos muy básicos en programación
Estoy por leer mas sobre el comando find o findstr en windows el cual pocas veces he utilizado y luego seria algo como
>Fichero4.txt
Mas no se como hacer en bat o vbs para que abran los fichero uno a uno en orden.
Gracias por leer igual estoy buscando sobre el tema, cualquier comentario, ayuda o etc es bienvenida.
Hola!
Revisa esto (http://stackoverflow.com/questions/15533214/how-do-i-read-a-file-line-by-line-in-vb-script) (vbs).
Saludos!
Lo hare muchas gracias tengo este tema duplicado por error como puedo borrar uno de los dos o hablar con el moderador, pues cuando le doy a la cruz de eliminar no me deja y me dice que hay alguien visitando el tema.
Cita de: MCKSys Argentina en 20 Febrero 2015, 08:44 AM
Hola!
Revisa esto (http://stackoverflow.com/questions/15533214/how-do-i-read-a-file-line-by-line-in-vb-script) (vbs).
Saludos!
Lo lei pero no aplica a mi caso, ahi solo dicen como leer un fichero y yo tengo varios y no necesito todo el contenido de la primera linea sino solo una parte para luego darlos todos juntos en un solo fichero. No se si me explique.
Cita de: AngelFire en 20 Febrero 2015, 08:49 AM
Lo lei pero no aplica a mi caso, ahi solo dicen como leer un fichero y yo tengo varios y no necesito todo el contenido de la primera linea sino solo una parte para luego darlos todos juntos en un solo fichero. No se si me explique.
Leer 1 archivo o 3 archivos, es indistinto aquí. Revisa el ejemplo y trata de entenderlo para aplicarlo a tu situación.
Lo mismo con lo que lees: puedes leer todo o sólo 1 lineay luego parsear esa línea. Esta (http://www.w3schools.com/vbscript/func_instr.asp) función te será útil.
Aqui (http://www.w3schools.com/vbscript/vbscript_ref_functions.asp) tienes todas las funciones de VB. Revisa las que son para archivos y strings.
Saludos!
Intente algo como esto pero no me sirve aun
@echo off
(
findstr "Cash out:" 1.txt
findstr "Cash out:" 2.txt
findstr "Cash out:" 3.txt
) > "4.txt"
Esperaba algo de salida como
Cash out:
Cash out:
Cash out:
Pero nada lo que obtuve no es mas que el contenido de 1.txt+2.txt+3.txt todo uno a continuacion de otro y no es lo deseado.
Tampoco se como tomar el valor numérico que sigue a continuación porque como expuse anteriormente son variables los numeros van desde 0.00 a infinito siempre conservando dos lugares despues del . (.00)
Saludos
Se ve muy bueno esta ayuda lo leere con calma http://www.w3schools.com/vbscript/vbscript_ref_functions.asp
Cita de: AngelFire en 20 Febrero 2015, 08:55 AM
Intente algo como esto pero no me sirve aun
@echo off
(
findstr "Cash out:" 1.txt
findstr "Cash out:" 2.txt
findstr "Cash out:" 3.txt
) > "4.txt"
Esperaba algo de salida como
Cash out:
Cash out:
Cash out:
Batch es un lenguaje muy limitado y una herramienta inutil para ese tipo de tareas.
El comando FIND/FINDSTR buscan coincidencias en una linea, y muestran la linea, no capturan la parte parcial de la linea que coincide con el patrón de búsqueda.
Sigue el consejo del compañero @MCKSys Argentina, utiliza VisualBasicScript, pero utiliza expresiones regulares (RegEx) que es más cómodo.
Saludos!
Ok ya estoy de nuevo en ello, gracias por avisar que el find y findstr no puedo hacer capturas de una linea.
Voy por aquí pero me faltan aun que los ficheros de salida contengan solo el pedazo que me interesa:
Salida1.txt
Cash Out: 232.45
Salida2.txt
Cash Out: 123232.35
Salida3.txt
Cash Out: 42.40
De ahí solo tendría que pasar el bat anteriormente expuesto que lo que hace es pasar todo los ficheros de salida del 1 al 3 en un text 4.
On Error Resume Next
Dim Cadena
Set Carpeta = CreateObject("Scripting.FileSystemObject")
Carpeta.CreateFolder ".\output"
For i = 1 To 3
Fichero = "C:\Ejemplo\" & i &".txt"
'MsgBox Fichero,0,"Muestra"
'Set texto = CreateObject("Scripting.FileSystemObject")
'texto.CopyFile Fichero,".\Salida.txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
filepath = Fichero
substrToFind = "CashOut:"
Set objInputFile = objFSO.OpenTextFile(filepath)
tmpStr = objInputFile.ReadLine
If InStr(tmpStr, substrToFind) <= 0 Then
WScript.Echo "No se encontro la cadena en " & i &".txt"
Else
Set texto = CreateObject("Scripting.FileSystemObject")
Set salida = texto.CreateTextFile (".\output\Salida" & i &".txt", True)
salida.WriteLine i
salida.Close
End if
Next
casi completo de mucha ayuda me sirvio esto
salida.WriteLine (Mid(tmpStr,899,5)) &" "& (Mid(tmpStr,934+4,25))
Modo de empleo
CScript.exe ".\Script.vbs" ".\Archivo1.txt" ".\Archivo2.txt" "etc..."
Source
' Example: RegEx capture in textfile, By Elektro
Option Explicit
Dim args, arg, _
outPath, fullpath, fileName, fileExt, _
fso, file, fileContent, _
rgx, rgxMatches, rgxMatch, rgxValue
Set args = WScript.Arguments
If args.Count = 0 Then
Wscript.Echo("Any filepath specified.")
Wscript.Quit(1)
End If
outPath = ".\Output\"
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(outPath) Then
Call fso.CreateFolder(outPath)
End If
' El primer grupo de esta expresión captura el string "cash out:" plus el valor decimal.
' El cuarto grupo de esta expresión captura el valor decimal.
Set rgx = New RegExp
rgx.Pattern = "Cash(\s+)?out(\:)?(\s+)?([\d\.]+)"
rgx.IgnoreCase = True
rgx.Global = True
For Each arg in args
fullPath = fso.GetAbsolutePathName(arg)
fileName = fso.GetBaseName(fullPath)
fileExt = fso.GetExtensionName(fullPath)
fileContent = fso.OpenTextFile(fullPath, 1).ReadAll
Set rgxMatches = rgx.Execute(fileContent)
Set file = fso.CreateTextFile(outPath & "\" & fileName & "_new" & "." & fileext)
Wscript.Echo("[+] Processing file: " & fullPath)
For Each rgxMatch in rgxMatches
rgxValue = rgxMatch.Submatches(3)
Wscript.Echo(rgxValue)
Call file.WriteLine("Cash Out: " & rgxValue)
Next
file.Close
Next
Wscript.Quit(0)
Output
asdadasdasdasd asdsadas asdasdasd cash out: 1.97 asdasdas asdasda
asdadasdasdasd asdsadas asdasdasd cash out: 212.34 asdasdas asdasda
Cash Out: 1.97
Cash Out: 212.34
Saludos
Elektro excelente código ya que con el mio no conseguía tan buen resultado. Estoy intentando entenderlo aun ya que contiene un camión de cosas que nunca he usado porque te repito mi nivel es muy básico.
No se si notaste que use:
Fichero = "C:\Ejemplo\" & i &".txt"
Esto se debe que estamos probando solo con 3 archivos pero en la practica son aproximadamente 1 000 000 de txt.
Como te puedes dar cuenta esto es un problema a la hora de:
CScript.exe ".\Script.vbs" ".\Archivo1.txt" ".\Archivo2.txt" "etc..."
Creo que resuelvo con esto:
On Error Resume Next
For i = 1 To 100000
Set crack = CreateObject("WScript.Shell")
crack.Run "cscript.exe .\Script.vbs .\input\"&i&".txt",vbhide
wscript.sleep 500
next
MsgBox "Tarea Finalizada",0,"Prueba"
Cual seria la modificación a realizar en tu excelente código Elektro para poder sacar el valor de un Archivo1.txt que contenga:
Citar<b>Cash Out: </b> 1.97x </p>
<b>Cash Out: </b> 212.34x </p>
Pensé que no seria un problema con el ejemplo que puse que Archivo1.txt era
Citarasdadasdasdasd asdsadas asdasdasd cash out: 1.97 asdasdas asdasda
asdadasdasdasd asdsadas asdasdasd cash out: 212.34 asdasdas asdasda
para no complicar mucho las cosas.
Pero si es un problema a la hora de aplicarlo al Archivo1.txt en cuestion:
Citar<b>Cash Out: </b> 1.97x </p>
<b>Cash Out: </b> 212.34x </p>
[MOD]: Está prohibido hacer doble post.
CitarCual seria la modificación a realizar en tu excelente código Elektro para poder sacar el valor de un Archivo1.txt que contenga:
<b>Cash Out: </b> 1.97x </p>
<b>Cash Out: </b> 212.34x </p>
Para sacar el "1.97" usa esta expresión:
rgx.Pattern = "(cash.+out.+\s+)([\d\.]+)"
Si quieres sacar el "1.97" incluyendo la "x" (que no se a que hace referencia), usa esta expresión:
rgx.Pattern = "(cash.+out.+\s+)([\d\.]+[^\s])"
Como he disminuido la cantidad de grupos de la expresión (para no hacer demasiado compleja la expresión regular por las etiquetas Html), debes usar esta modificación también:
rgxValue = rgxMatch.Submatches(1)
Saludos
Moderador disculpe por el doble post pero cada vez que le daba eliminar en la cruz me decía que no se podía porque alguien lo estaba viendo, de todas maneras aceptada por mi parte la alerta de que no se acepta doble post.
Increíble funciona a la perfección para con x y sin x
<b>Cash Out: </b> 1.97x </p>
<b>Cash Out: </b> 212.34x </p>
Pero al pasarselo a 1.html no funciona :( alguna idea:
<!DOCTYPE html><html> <head> <title>Play Info -- xxxxxx.com</title> <link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon"> <link rel="icon" href="/img/favicon.ico" type="image/x-icon"> <meta charset="utf-8" /> <meta name="format-detection" content="telephone=no" /> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height"/> <link rel="stylesheet" href="/css/cb42743da.css" /> </head><body><div class="wrap"> <header> <nav class="nav-top-bar"> <div class="title"> <a href="/"> <img src="/img/logo.png" alt="logo" width="40px" /> <h1 class="hide-for-small-only">xxxxxx.com</h1> </a> </div> <div class="show-for-small-up user-login"> <a href="/register">Register</a> <a href="/login">Log in</a> </div> </nav> </header> <div class="content"> <div class="row panel radius"> <h4>Game #<strong>1</strong> information</h4> <p> <b>Cash Out: </b> 2.46x </p> <p> <b>Played: </b>Sat Ene 12 2015 00:20:13 GMT+0000 (UTC) <small>7 months ago</small> </p> <hr> <h6>Players</h6> <table class="user-table"> <thead> <tr> <td>Player</td> <td>Bet</td> <td>Cash Out</td> <td>Bonus</td> <td>Profit</td> </tr> </thead> <tbody> </tbody> </table> <h6><b>Hash:</b> <a href="/faq#fair">null</a></h6> </div> </div> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-54064423-1', 'auto'); ga('send', 'pageview'); </script></div></body></html>
Creo que esto ayuda full a entender la parte mas compleja de tu codigo al menos para mi ;D
http://www.tutorialspoint.com/vbscript/vbscript_reg_expressions.htm
https://www.addedbytes.com/blog/code/vbscript-regular-expressions/
Cita de: AngelFire en 22 Febrero 2015, 23:10 PMfunciona a la perfección para con x y sin x
Pero al pasarselo a 1.html no funciona :( alguna idea:
<!DOCTYPE html><html> <head> <title>Play Info -- xxxxxx.com</title> <link rel="shortcut icon" href="/img/favicon.ico" type="image/x-icon"> <link rel="icon" href="/img/favicon.ico" type="image/x-icon"> <meta charset="utf-8" /> <meta name="format-detection" content="telephone=no" /> <meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height"/> <link rel="stylesheet" href="/css/cb42743da.css" /> </head><body><div class="wrap"> <header> <nav class="nav-top-bar"> <div class="title"> <a href="/"> <img src="/img/logo.png" alt="logo" width="40px" /> <h1 class="hide-for-small-only">xxxxxx.com</h1> </a> </div> <div class="show-for-small-up user-login"> <a href="/register">Register</a> <a href="/login">Log in</a> </div> </nav> </header> <div class="content"> <div class="row panel radius"> <h4>Game #<strong>1</strong> information</h4> <p> <b>Cash Out: </b> 2.46x </p> <p> <b>Played: </b>Sat Ene 12 2015 00:20:13 GMT+0000 (UTC) <small>7 months ago</small> </p> <hr> <h6>Players</h6> <table class="user-table"> <thead> <tr> <td>Player</td> <td>Bet</td> <td>Cash Out</td> <td>Bonus</td> <td>Profit</td> </tr> </thead> <tbody> </tbody> </table> <h6><b>Hash:</b> <a href="/faq#fair">null</a></h6> </div> </div> <script> (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-54064423-1', 'auto'); ga('send', 'pageview'); </script></div></body></html>
El motor RegEx no fue diseñado para parsear documentos Html, RegEx no entiende la estructua Html, y para ciertas cosas se puede volver un auténtico desafio el diseñar la expresión correcta.
rgx.Pattern = "cash.+out.+\s+<\/\w+>\s+([\w\.]+)"
...
rgxValue = rgxMatch.Submatches(0)
Con esa expresión regular obtienes el valor "2.46x" en ese documento Html.
Para más info sobre el manejo de Regex, es preferible que leas la Wikipedia: http://en.wikipedia.org/wiki/Regular_expression
Saludos
Excelente decididamente eres un duro en el tema funciona a la perfección. No pensé que creara tantos obstáculos desde el principio no dar el ejemplo del fichero en cuestión así como no hice mucho casos a que fuera txt o html pero ya veo cuan equivocado estaba.
Ok te voy diciendo como queda todo:
Asi descargo el 1000000 de resultados separados en carpetas de 100000.
On Error Resume Next
For i = 1 To 100000
Set crack = CreateObject("WScript.Shell")
crack.Run "wget -r -nd -P 100000 -A .html -e robots=off --no-check-certificate https://www.xxxxx.com/game/"&i&".html",vbhide
wscript.sleep 500
next
MsgBox "Tarea Finalizada",0,"Download"
Asi paso tu script de ayuda a los 100000 resultados
On Error Resume Next
For i = 1 To 100000
Set cmd = CreateObject("WScript.Shell")
cmd.Run "cscript.exe .\Script.vbs .\game\100000\"&i&".html",vbhide
wscript.sleep 500
next
MsgBox "Tarea Finalizada",0,"Valor"
Tu script
' Example: RegEx capture in textfile, By Elektro
'CScript.exe ".\Script.vbs" ".\1.html" ".\2.html" "etc...
Option Explicit
Dim args, arg, _
outPath, fullpath, fileName, fileExt, _
fso, file, fileContent, _
rgx, rgxMatches, rgxMatch, rgxValue
Set args = WScript.Arguments
If args.Count = 0 Then
Wscript.Echo("Any filepath specified.")
Wscript.Quit(1)
End If
outPath = ".\Output\100000\"
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(outPath) Then
Call fso.CreateFolder(outPath)
End If
' El primer grupo de esta expresión captura el string "cash out:" plus el valor decimal.
' El cuarto grupo de esta expresión captura el valor decimal.
Set rgx = New RegExp
rgx.Pattern = "Cash.+Out.+\s+<\/\w+>\s+([\w\.]+)"
rgx.IgnoreCase = True
rgx.Global = True
For Each arg in args
fullPath = fso.GetAbsolutePathName(arg)
fileName = fso.GetBaseName(fullPath)
fileExt = fso.GetExtensionName(fullPath)
fileContent = fso.OpenTextFile(fullPath, 1).ReadAll
Set rgxMatches = rgx.Execute(fileContent)
Set file = fso.CreateTextFile(outPath & "\" & fileName & ".txt")
Wscript.Echo("[+] Processing file: " & fullPath)
For Each rgxMatch in rgxMatches
rgxValue = rgxMatch.Submatches(0)
Wscript.Echo(rgxValue)
Call file.WriteLine("Cash Out: " & rgxValue)
Next
file.Close
Next
Wscript.Quit(0)
Así uno todas las salidas de tu script en un solo fichero con 100000 lineas
On Error Resume Next
For i = 1 To 100000
Fichero = "C:\Play\output\100000\" & i &".txt"
Set objFSO = CreateObject("Scripting.FileSystemObject")
filepath = Fichero
Set objInputFile = objFSO.OpenTextFile(filepath)
tmpStr = objInputFile.ReadLine
Set texto = CreateObject("Scripting.FileSystemObject")
Set salida = texto.CreateTextFile (".\Salida100000.txt", True)
salida.WriteLine (Mid(tmpStr,1,50)) & n
Next
MsgBox "Tarea Finalizada",0,"Play"
Y después puedo realizar el análisis importando Salida100000.txt a excel pero realmente todo es para ver esto que pregunte aqui http://foro.elhacker.net/scripting/ayuda_con_excel-t430543.0.html, ya que puedo ver mas cosas pero la que mas me interesa aun no se jajajajajajaj.
Que tengo un script en python que lo hace pero me gustaría ver igual como se soluciona en excel ;).
Aquí la versión en español de lo que pasaste para los que no dominen mucho el ingles: http://es.wikipedia.org/wiki/Expresi%C3%B3n_regular
Gracias por todo.
Cita de: AngelFire en 24 Febrero 2015, 02:10 AM
Excelente decididamente eres un duro en el tema funciona a la perfección. No pensé que creara tantos obstáculos desde el principio no dar el ejemplo del fichero en cuestión así como no hice mucho casos a que fuera txt o html pero ya veo cuan equivocado estaba.
No te preocupes, en un lenguaje limitado como VBS la única alternativa más o menos decente para parsear texto es utilizar RegEx, o eso, o a base de Splits + y comparaciones de String, lo que que se vuelve muy tedioso en este lenguaje.
Solo quería remarcarte que utilizar RegEx puede causarte frustración por problemas de diseño debido a sus limitaciones impuestas por naturaleza sobre estructuras Html, pero vaya, de poco importa ya que RegEx es lo único que puedes utilizar, a menos que cambies de lenguaje por uno más competente el cual disponga de herramientas eficientes para dicha tarea (dichas herramientas siempre pueden ser también el uso de librerías de terceros).
Saludos!
El script presenta problemas para tipos:
Citar16,002x
160,989.4x
1,900x
:-\