Avatar billede kaldor Nybegynder
02. juni 2003 - 15:01 Der er 14 kommentarer

Opdatering af indhold mellem txt-filer, hvordan?

Hej Exp

Jeg administrer to CS servere på samme maskine og har i den forbindelse brug for at opdatere listerne med bannede WONIDs mellem de to servere. Altså sådan så de to lister kan synkroniceres en gang i døgnet.

Hvis jeg bare kopiere den ene over i den anden, så bliver den jo overskrevet og jeg kan ikke regne ud hvordan jeg bare kopiere indholdet fra den ene til den anden fil, sådan så eksisterende observationer beholdes/overskrives, mens nye tilføjes.

Min idé er at først at kopiere den første over i den anden, og derefter den anden over i den første.

Nogen forslag?

Mvh
Avatar billede roenving Novice
02. juni 2003 - 15:06 #1
Kunne du ikke henvise til den samme fil, når de nu ligger på samme maskine ?-)
Avatar billede kaldor Nybegynder
02. juni 2003 - 15:31 #2
Klogt svar, da det jo vil være den anden mulighed.
Og det er faktisk en løsning som loader de bannede IDs ind i programmet. Så jeg sætter bare begge servere til at loade de bannede IDs fra sin egen liste og fra den anden servers liste. Så langt så godt.
Problemet er nu at hvis man vha HLSWen (et spilserverovervågningsprogram) vil se listen over bannede IDs, så viser den kun den pågældende servers og ikke dem den har loadet fra den anden server. Og det er ikke helt optimalt, men jeg er tæt på at nå den optimale løsning :-)
Avatar billede nop Nybegynder
02. juni 2003 - 15:40 #3
I cmd-mode tastes:
copy a1.txt +a2.txt a3.txt
Laver en ny fil med a2+a2, man kan sikkert også bruge a1 +a2 a1, altså destination a1.
Avatar billede kaldor Nybegynder
02. juni 2003 - 15:57 #4
Tæt på! Det virker næsten. Men hvis der er flere obs i b end i a og man skriver copy a +b b, så sletter den de obs som er i b, men ikke i a. Og hvis man skriver copy a +b a , så kopierer den fint det hele ind i a, men lader evtuelle ens obs stå, så de er der dobbelt. (hvis obs findes både i a og i b). Den overskriver altså ikke allerede eksisterende observationer.
Avatar billede nop Nybegynder
02. juni 2003 - 16:04 #5
Nej, det er jo ikke en intelligent merging ! Det er bare en kopier med append.
Der findes sikkert nogle standard værktøjer der kan gøre det du vil ellers må du programmere et.
Avatar billede roenving Novice
02. juni 2003 - 16:08 #6
Hvis du kunne have det som en replkationsservice ville man kunne lave det !-)

-- f.eks. som den måde som servere på et netværk vedligeholder brugerlister ...

-- eller hvis det var noget som blev klaret fra en database, kunne en tabel 'bare' vedligeholdes to forskellige steder fra ...
Avatar billede kaldor Nybegynder
02. juni 2003 - 16:19 #7
Hmmm... der er det så at Kaldors programmeringsevner ophører...  :-(
Avatar billede roenving Novice
02. juni 2003 - 16:25 #8
*gg* -- hvis du har adgang til en database, kunne du jo spørge i den passende kategori ;O)
Avatar billede bertelbrander Novice
02. juni 2003 - 19:26 #9
Man kan måske lave et lille batch script til at gøre det. For at svare på om man kan er jeg nød til at vide hvilken OS det skal kører på, og hvordan de to filer ser ud.
Avatar billede kaldor Nybegynder
02. juni 2003 - 19:39 #10
Serveren er en XP-prof og de to filer ligge i hver deres mappe og hedder banned.cfg, hvor hvert bannede ID er registreret således:

banid 0.0 123456
banid 60.0 2345666
banid 399.0 124343
osv..

på hver sin linie. De 0.0 udtrykker tiden i minutter (0 = permanent), som ban'et skal vare.

Håber du kan trylle med disse oplysniger :-)
Avatar billede bertelbrander Novice
02. juni 2003 - 23:05 #11
Er det sidste tal på linien det tal der skal bruges til at merge ud fra eller er det banid?
Jeg arbejder på en løsning.
Avatar billede kaldor Nybegynder
02. juni 2003 - 23:29 #12
Det er det sidste tal som er wonid'et, og det som serveren banner efter og som er det som gerne skulle kunne synkroniseres mellem de to servere. Half-Life (spillet) kan dog ikke indlæse IDerne hvis den ikke først får at vide at det er et ID, og i hvorlang tid den skal holde på det, derfor først 'banid' og '0.0' .
Du kan se et eksempel på filen her http://ruben.tumpe.dk/banned.txt

Jeg er meget glad for din indsats (mest hvis den fører til noget :-)
Avatar billede bertelbrander Novice
02. juni 2003 - 23:38 #13
Følgende skulle kunne bruges. Du putter det i en fil med .cmd (eller .bat) som extension, du kalder derefter batch-filen, med de to input filer som de to første argumenter, og output filen som det sidste argument.
Som med det meste software jeg laver vil jeg tilråde at du prøver det på nogle test filer først.

@echo off
rem Check if the user has applied some correct arguments
if [%1]==[] call :usage %0 & goto :eof
if [%2]==[] call :usage %0 & goto :eof
if [%3]==[] call :usage %0 & goto :eof
if not exist %1 echo The file %1 does not exist& call :usage %0 & goto :eof
if not exist %2 echo the file %2 does not exist& call :usage %0 & goto :eof
if exist %3 del %3

setlocal
set in1=%1
set in2=%2
set out=%3

rem Run thru each line in in1, if the id is not found in in2 the line is written to out
for /F "delims=;" %%i in (%in1%) do call :merge "%%i"

rem Append in2 to the end of out
for /F "delims=;" %%i in (%in2%) do echo %%i >>%out%
rem We are done
endlocal
goto :eof

:merge
rem Extract the ID from the line
for /F "tokens=3" %%i in ("%~1") do set id1=%%i
rem Read each line in in2
set match=0
for /F "delims=;" %%i in (%in2%) do call :check "%%i"
rem Write the line from in1 to out if no match has been found
if [%match%]==[0] echo %~1 >>%out%
goto :eof

:check
rem Extract the ID from the line
for /F "tokens=3" %%i in ("%~1") do set id2=%%i
rem Is the ID's the same ?
if [%id1%]==[%id2%] set match=1
goto :eof

:usage
echo Usage: %1 in1 in2 out
Avatar billede roenving Novice
03. juni 2003 - 01:18 #14
>>bertel *gg*
Som med det meste software jeg laver vil jeg tilråde at du prøver det på nogle test filer først.
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