17. december 2006 - 17:07Der er
5 kommentarer og 1 løsning
søg og erstat i mange txt filer i en mappe på een gang
Hejsa,
Jeg har købt et program kaldet Pokertracker, som hjælper mig med at analysere statistikken på mine modspillere ud fra nogle tekstlogs som pokersitet realtime skriver på mit c-drev mens jeg spiller. Desværre har Interpoker ændret i de logfiler som Pokertracker skal bruge. Så nu er jeg nødt til at lave en lille work-around og selv ændre log'en tilbage til hvordan den så ud før...
Jeg tror at jeg måske selv kan lave det i Excel VBA, men har ingen erfa med vbscript, så derfor vil jeg meget gerne be' om hjælp, da opgaven ikke har noget med office pakken at gøre, som sådan:
For hver txt-fil (endelsen er ".log" fil) i en mappe som jeg definerer ved kørselsstart (fx inputbox, hvor jeg kopiere stinavn over) skal koden åbne log filen og se i linje 2 om linjen starter med følgende tekst: Tabel "xx" hvor xx er et nummer. Derefter skal den ændre denne del af linje 2 til Table "Tourney yyy - xx", hvor yyy er en streng som skal defineres fx ved kørselsstart og svarer til hvilken turnering det drejer sig om og xx er det bord nummer som oprindeligt stod i linjen. Derefter skal filen gemmes og næste fil åbnes.
Er der nogen der kan hjælpe mig med den justering så vil jeg være tak skyldig...
Et eksempel Linje 2 i log filen "2332760903.log" FØR Table "25" Seat 6 is the button EFTER Table "Tourney 3392282 - 25" Seat 6 is the button
Hvor nummeret 3392282 skal indtastes af mig i en form for input box. Lad os for nemhedens skyld sige, at det samme Tourney nummer skal genbruges på alle filerne i mappen.
Hey handstand ! Her kommer der lige lidt rodet kode :o) Følgende sker undervejs :
1. Du bliver promptet for mappen, som filerne ligger i 2. Du bliver promptet for Tourney nr 3. Mappen gennemløbes for .log filer 4. Hvis der findes nogen, åbnes de, og linie 2 tjekkes for "Table" 5. Hvis Table står der rettes teksten til tourner o.s.v. 6. Filen gemmes i c:\temp\logs for ikke, at lave en lykke på filgennemløbet 7. Når scriptet er færdigt, kopieres logfilerne ind på plads, og overskriver de gamle
Tag lige en backup af bib først ;) )
set fso = createobject("scripting.filesystemobject") if not fso.folderexists ("c:\temp") then fso.createfolder("c:\temp") end if if not fso.folderexists ("c:\temp\logs") then fso.createfolder("c:\temp\logs") end if folder = inputbox("Indtast foldernavn") if not right(folder,1) = "\" then folder = folder & "\" tourney = inputbox("Indtast Tourney") set logmappe = fso.getfolder(folder) for each logfil in logmappe.files if Right(logfil.name,3) = "log" then set fileread = fso.opentextfile(folder & logfil.name,1) While Not fileread.AtEndOfStream line = line + 1 if line = 2 then linien = fileread.readline if instr(ucase(linien),"TABLE") <> 0 then tablenrarr = split(linien,chr(34)) tablenummer = tablenrarr(1) replacement = chr(34) & tablenummer & chr(34) replacemed = "Tourney " & tourney & " - " & tablenummer linien = replace(linien,replacement,replacemed) strsluttekst = strsluttekst & linien & vbcrlf else strsluttekst = strsluttekst & linien & vbcrlf end if else strsluttekst = strsluttekst & fileread.readline & vbcrlf end if Wend
Set Newfile = fso.CreateTextFile("c:\temp\logs\" & logfil.name,true) newfile.writeline(strsluttekst) newfile.close
end if fileread.close next
set sourcefolder = fso.getfolder("c:\temp\logs\") destinationsfolder = folder for each copyfil in sourcefolder.files fso.copyfile "c:\temp\logs\" & copyfil.name , destinationsfolder next
Ups ... Glemte, at der jo netop var flere filer :o)
set fso = createobject("scripting.filesystemobject") if not fso.folderexists ("c:\temp") then fso.createfolder("c:\temp") end if if not fso.folderexists ("c:\temp\logs") then fso.createfolder("c:\temp\logs") end if folder = inputbox("Indtast foldernavn") if not right(folder,1) = "\" then folder = folder & "\" tourney = inputbox("Indtast Tourney") set logmappe = fso.getfolder(folder) for each logfil in logmappe.files if Right(logfil.name,3) = "log" then set fileread = fso.opentextfile(folder & logfil.name,1) While Not fileread.AtEndOfStream line = line + 1 if line = 2 then linien = fileread.readline if instr(ucase(linien),"TABLE") <> 0 then tablenrarr = split(linien,chr(34)) tablenummer = tablenrarr(1) replacement = chr(34) & tablenummer & chr(34) replacemed = "Tourney " & tourney & " - " & tablenummer linien = replace(linien,replacement,replacemed) strsluttekst = strsluttekst & linien & vbcrlf else strsluttekst = strsluttekst & linien & vbcrlf end if else strsluttekst = strsluttekst & fileread.readline & vbcrlf end if Wend
Set Newfile = fso.CreateTextFile("c:\temp\logs\" & logfil.name,true) newfile.writeline(strsluttekst) newfile.close strsluttekst = "" linien = "" tablenummer = "" end if fileread.close line = 0 next
set sourcefolder = fso.getfolder("c:\temp\logs\") destinationsfolder = folder for each copyfil in sourcefolder.files fso.copyfile "c:\temp\logs\" & copyfil.name , destinationsfolder next
Hej killerclown. Foreløbig tak for hjælpen - det ser godt ud, tror bare lige det skal justeres igennem for at matche helt:
Jeg sidder lige og læser koden igennem og har et par spm:
Her er vores udgangspunkt: FØR Table "25" Seat 6 is the button EFTER Table "Tourney 3392282 - 25" Seat 6 is the button
Det skal meget gerne stå nøjagtigt som ovenstående, bagefter - for at det virker. Der er dobbeltpinger omkring bord nummeret. Dvs, der står "25", ikke 25. Tager din kode højde for det? Ordet Table skal bibeholdes og teksten Tourney 3392282 - 25 skal stå i dobbeltpinger, Dvs, det må være noget med at identificere alt den tekst der er efter 2. mellemrum og sætte dette sammen med: Table & """ & "Tourney " & YYY & """ & Det efter 2. mellemrum. - Gør din kode det?. Jeg ved ikke lige hvad Chr for " er... Og så tror jeg også at jeg kommer til at skyde koden af, mens der vil ligge filer, hvorpå koden allerede er brugt, dvs, jeg tror at man skal kombinere din instr(ucase(linien) med at, at der skal stå 'table', samtidig med at der ikke må stå 'table "tourney'
Hvis du har mulighed for at hjælpe med dette ift din kode vil det være helt super, for jeg kan læse vbscript sådan nogenlunde, men jeg kan ikke lige gennemskue hvordan jeg skriver koden.
Arh ja ... Det gik vist lidt stærkt med, at skrive den anden kode :) Nu skulle du også slippe for, at komme til, at køre den 2 gange på samme filer :o)
set fso = createobject("scripting.filesystemobject") if not fso.folderexists ("c:\temp") then fso.createfolder("c:\temp") end if if not fso.folderexists ("c:\temp\logs") then fso.createfolder("c:\temp\logs") end if folder = inputbox("Indtast foldernavn") if not right(folder,1) = "\" then folder = folder & "\" tourney = inputbox("Indtast Tourney") set logmappe = fso.getfolder(folder) for each logfil in logmappe.files if Right(logfil.name,3) = "log" then set fileread = fso.opentextfile(folder & logfil.name,1) While Not fileread.AtEndOfStream line = line + 1 if line = 2 then linien = fileread.readline if instr(ucase(linien),"TABLE") <> 0 and instr(ucase(linien),"TABLE " & chr(34) & "TOURNEY") = 0 then tablenrarr = split(linien,chr(34)) tablenummer = tablenrarr(1) replacement = chr(34) & tablenummer & chr(34) replacemed = chr(34) & "Tourney " & tourney & " - " & tablenummer & chr(34) linien = replace(linien,replacement,replacemed) strsluttekst = strsluttekst & linien & vbcrlf else strsluttekst = strsluttekst & linien & vbcrlf end if else strsluttekst = strsluttekst & fileread.readline & vbcrlf end if Wend
Set Newfile = fso.CreateTextFile("c:\temp\logs\" & logfil.name,true) newfile.writeline(strsluttekst) newfile.close strsluttekst = "" linien = "" tablenummer = "" end if fileread.close line = 0 next
set sourcefolder = fso.getfolder("c:\temp\logs\") destinationsfolder = folder for each copyfil in sourcefolder.files fso.copyfile "c:\temp\logs\" & copyfil.name , destinationsfolder next
Ups - Mine testdata røg. Ikke på grund af ovenstående kode, men fordi jeg eksekverede Pokertrackers hand history import, som derefter fjernede filerne...(Jeg troede ikke den fjernede ikke-importbare-filer, men det gjorde den. Desværre har jeg ikke lige tid til at skabe nye data idag, så det kommer lige til at vente et par dage :-(
Bummer - det er noget mere langhåret end jeg lige havde troet - koden virker fint nok, men det løser desværre ikke problemet. Tak for hjælpen killerclown - men jeg kom ikke i mål.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.