Avatar billede mr.handstand Novice
17. december 2006 - 17:07 Der 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.
Avatar billede killerclown Nybegynder
17. december 2006 - 18:13 #1
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


/Killer
Avatar billede killerclown Nybegynder
17. december 2006 - 18:21 #2
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

/Killer
Avatar billede mr.handstand Novice
17. december 2006 - 22:44 #3
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.
Avatar billede killerclown Nybegynder
17. december 2006 - 22:54 #4
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


/Killer
Avatar billede mr.handstand Novice
18. december 2006 - 20:27 #5
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 :-(

Men foreløbig mange tak for hjælpen...
Avatar billede mr.handstand Novice
03. januar 2007 - 10:00 #6
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester