Textverarbeitungsskript - Automatisches Kopieren von Zeilen aus einer Datei in Andere

apopo

Cadet 3rd Year
Registriert
Juli 2008
Beiträge
51
Hallo,

ich habe folgendes Problem, für dass ich eine Programmautomatisierung (bat/skript oder ähnliches) suche, die nach möglichkeit alle schritte mit einem klick durchführt.

Ganz einfach gesagt: Ich suche ein Programm, dem ich zwei Textdateien angeben kann und dass dann allen text zwischen zwei definierten "MagicWords" der einen datei in die andere Kopiert... Gibt es das?

Um es genauer zu beschreiben:
Ich habe zwei Datenbanken in textdateien, die beide unabhängig voneinander geführt werden. Der einfachheit halber kann man sich die Daten jetzt mal so vorstellen:

Datenbank 1/2:
X
13123
21312
1211
12345
12213
Y
12334
123231
12322
1223
3341
Z
1233
12333
122332
1233

Mit anderen worten werden unter benannten klassen X Y Z beliebig viele werte abgelegt, wobei die zahlenfolgen hier nur beispiele sind und eben in wirklichkeit länger sind...

Nun kann Anwendung 1 nicht auf Datenbank 2 und Anwendung 2 auch nicht auf DB 1 zugreifen. Desweiteren ändert Anwendung 1 lediglich die Werte in den Klassen X und Z, nicht aber in Y und Anwendung 2 ändert nur die Werte in Y. Alle Paar Tage brauche ich jedoch eine art Syncronisierung, infolge derer die Anwendungen kurz stillgelegt werden und einfach alles, was zwischen Y und Z in Datenbank 2 steht (also alle Einträge von Y) zwischen das Y und Z in der ersten Datei kopiert wird. Die alten Werte sollen dabei gelöscht werden. So kann dann nach wiederanfahren der Anwendungen die Anwendung 1 auf X und Z, sowie das aktualisierte Y zugreifen...

Vielen Dank schonmal für etwaige antworten =D

Gruß,

apopo
 
Ich hab da mal ein Batch-Script geschrieben:
Code:
@echo off

:: temporäre Datei %newdb, in der die neue Datenbank entsteht
set newdb=newdb.txt
rem. >%newdb%

:: kopiere die Teile in die neue Datei
call :copytable  db1.txt X
call :copytable  db2.txt Y
call :copytable  db1.txt Z

:: Ersetze die alten Dateien durch %newdb% und lösche %newdb%
copy %newdb%  db1.txt
copy %newdb%  db2.txt
del  %newdb%

goto :eof

:copytable
awk -v table=%2 ^
 "{ if ($0 == table) {intable = 1} else if (/^[0-9]*$/) {} else {intable = 0} if (intable) print }" ^
 %1 >>%newdb%
goto :eof
Am interessantesten sind die Zeilen mit "call :copytable" und "copy %newdb%". Da musst du die Dateinamen (hier db1.txt, db2.txt) und Tabellenüberschriften (hier X, Y, Z) anpassen.

In der angehängten zip-Datei findest du
- merge.bat : das Skript
- awk.exe : notewendig, muss im selben Ordner wie merge.bat sein
- db1.txt, db2.txt : Beispieldateien, mit denen ich getestet habe

Ich hoffe, dass das so richtig ist. Ansonsten einfach nachfragen.
 

Anhänge

Hi quwieorp,

vielen Dank schonmal für Deine Mühen, ich werde das Skript die Tage mal testen und Dir dann feedback geben!

Danke!
Ergänzung ()

hi nochmal,

habs jetzt mal durchgetestet.

Da ich der meinung war, dass der Inhalt der Zeilen egal ist beim kopieren, hab ich einfach nur zahlen angegeben, gebe ich nun aber eine Zeile mit Buchstaben an, so werden diese nicht nur nicht übertragen sondern auch noch gelöscht in beiden dateien =D

Es ging mir in meinem Beispiel nur um die Struktur, eben dass es mehrere Bereiche gibt und ich halt den text zwischen zwei bereichen kopieren will.

In der Realität sieht das aber eher so aus:

["Default.ID1.ID2"] = {
["variable"] = 2
["variable2"]=4
.
.
.
["count"] = {
1, -- [1]
4, -- [2]
}
}

also das ist so der Inhalt der Zeilen, Der Block, den ich kopieren will, umfasst in dem Falle dann eben alles zwischen "["Default.ID1.ID2"] = {" und "["Default.ID3.ID4"] = {", was dann im ersten Beispiel unsere magicwords, also X und Y sind. Z wäre dann eben "["Default.ID5.ID6"] = {".

Der zu kopierende Inhalt umfasst also auch text, satzpunktzeichen, Klammern etc.

Kann man das möglichweise einfach umdokorn?

Danke schonmal,

apopo
Ergänzung ()

Und nochmal ein anhang: Ich habe (hehe) eine alternative gefunden. Es reicht, wenn ich die Datenbank 1 in das Verzeichnis des zweiten Prozesses lege und ihn einmal laufen lasse, er aktualisiert dann automatisch nur diesen Bereich. Die einfachste lösung ist immer noch die beste. Dann brauch ich jetzt nur noch ne batch, mit der ich die datei von 1 in 2 verschieben und die dortige ersetzen kann und umgekehrt... Aber da sollte mir google ja auch helfen können!

Trotzdem vielen vielen Dank =D

Gruß,

apopo
 
Zurück
Oben