1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

bestimmte Zeilen mit batch kopieren

Discussion in 'Programmieren' started by Drohnald, Sep 5, 2008.

Thread Status:
Not open for further replies.
  1. Drohnald

    Drohnald Kbyte

    Moin moin,

    folgendes problem:
    ich hab ne batch geschrieben mit dem fc befehl und 2 .log dateien verglichen. die unterschiede hab ich in einer unterschiede.txt gespeichert.

    jetzt hätt ich aber gerne, dass mir nicht angezeigt wird
    ***** eins.log
    item_id=0001-1000-0300-0399_0396GS0001_
    item_id=0001-1000-0300-0399_0396_006_PU
    item_id=0037764_8401
    item_id=0037764_8402
    ***** zwei.LOG
    item_id=0037764_8401
    item_id=0037764_8402
    *****


    sondern dass ich eine text datei habe die ich als "einsfehlend.txt" nennen kann. Also eine textdatei wo NUR drinsteht was in eins.log fehlt aber in zwei.log vorhanden ist.
    und natürlich eine zweite datei wo es umgekehrt ist.

    hab mir überlegt ne bat zu schreiben die quasi sagt "alles zwischen *****eins.LOG und *****zwei.LOG soll in einfehlend.txt"
    und ne zweite bat die sagt "alles zwischen *****zwei.LOG und ***** soll in zweifehlend.txt"

    dazu sei gesagt von den oben kopierten dings gibts einige tausend. also mehrere dieser blöcke.

    könnt ihr mir helfen?


    vielen dank schon mal für die mühen!"
    gruß Drohnald
     
  2. xemebw

    xemebw Byte

    Also ich bin jetzt nicht so der batch-Experte aber die Sache sieht für mich ziemlich kompliziert aus.
    Habe mal 'nen Anfang geschrieben:

    for /f "usebackq delims=" %%a in (`findstr /n /c:"eins.log" /g:"c:\unterschiede.txt"`) do more /e /s %%A +%%a >>"c:\unterschiede_eins.txt"

    (eine Zeile)

    Jetzt müsste man den Parameter %%A noch irgendwie als die Länge des jeweiligen Listenabschnitts definieren, das ganze noch mal für die Unterschiede in zwei.log machen und die zahllosen Fehler ausbügeln, die wahrscheinlich in diesem (ungetesteten) code stecken.

    Trotzdem poste ich das hier mal, vielleicht hilft es dir ja als Ansatz irgendwie weiter.
    :idee:
     
    Last edited: Sep 20, 2008
  3. xemebw

    xemebw Byte

    habe es nochmal probiert und diesmal eine etwas längere und hoffenlich bessere Lösung:

    Code:
    @echo off
    set /a counter=0
    set /a counter1=0
    set /a counter2=0
    set /a countera=0
    set /a counterb=0
    rem Routine 1
    :start
    for /f "usebackq delims=" %%a in (`findstr /n /c:"eins.log" /g:"c:\unterschiede.txt"`) do set /a stelle1_%counter1%=%%a+1 & set /a counter1=counter1+1
    for /f "usebackq delims=" %%a in (`findstr /n /c:"zwei.log" /g:"c:\unterschiede.txt"`) do set /a stelle2_%counter2%=%%a+1 & set /a counter2=counter2+1
    rem Routine 2
    :differenz
    set /a diff_%counter%=stelle2_%counter%-stelle1_%counter%-1
    if %counter%==%counter2% goto ausgabe1
    set /a counter=counter+1
    goto differenz
    rem Routine 3
    :ausgabe1
    more /e /p [B]%diff%countera%%[/B] +[B]%stelle1%countera%% [/B]<"c:\unterschiede.txt" >>"unterschiede_eins.txt"
    if %countera%==%counter% goto ausgabe2
    set /a countera=countera+1
    goto ausgabe1
    :ausgabe2
    more /e /p [B]%diff%counterb%%[/B] +[B]%stelle2%counterb%%[/B] <"c:\unterschiede.txt" >>"unterschiede_zwei.txt"
    if %counterb%==%counter% goto ende
    set /a counterb=counterb+1
    goto ausgabe2
    :ende
    Erklärung:
    Die Datei (sollte)
    Routine1: alle Zeilennummern, in denen eins.log bzw. zwei.log vorkommt in %stelle1_zahl% bzw %stelle2_zahl% schreiben
    Routine2: aus den jeweiligen Zeilennummern die Differenz (=Länge des Abschnitts) bilden und als %diff_zahl% speichern
    Routine3: von jeder stelle1_zahl aus diff_zahl Zeilen in die Ergebnisdatei schreiben (einmal für unterschiede_eins.txt und einmal für unterschiede_zwei.txt)

    Voraussetzung ist, dass immer abwechselnd ein ******eins.log und ein *****zwei.log-Bereich kommen.

    Funktionieren wird sie allerdings noch nicht, da die fettmarkierten Variablen nicht ordentlich aufgelöst werden, weil sie verschachtelt sind.
    Ich weiß leider nicht wie man das hinbekommt und auch sonst werden wohl noch Fehler drin sein aber es ist schon mehr als eine bloße idee.
    Hoffe es hilft.
     
    Last edited: Sep 21, 2008
  4. xemebw

    xemebw Byte

    Das Problem mit den Variablen ist gelöst:
    Code:
    @echo off & setlocal enabledelayedexpansion
    set /a counter=0
    set /a counter1=0
    set /a counter2=0
    set /a countera=0
    set /a counterb=0
    :start
    for /f "usebackq delims=" %%a in (`findstr /n /c:"eins.log" /g:"c:\unterschiede.txt"`) do set /a stelle1_%counter1%=%%a+1 & set /a counter1=counter1+1
    for /f "usebackq delims=" %%a in (`findstr /n /c:"zwei.log" /g:"c:\unterschiede.txt"`) do set /a stelle2_%counter2%=%%a+1 & set /a counter2=counter2+1
    :differenz
    set /a diff_%counter%=stelle2_%counter%-stelle1_%counter%-1
    if %counter%==%counter2% goto ausgabe1
    set /a counter=counter+1
    goto differenz
    :ausgabe1
    more /e /p !diff%countera%! +!stelle1%countera%! <"c:\unterschiede.txt" >>"unterschiede_eins.txt"
    if %countera%==%counter% goto ausgabe2
    set /a countera=countera+1
    goto ausgabe1
    :ausgabe2
    more /e /p !diff%counterb%! +!stelle2%counterb%! <"c:\unterschiede.txt" >>"unterschiede_zwei.txt"
    if %counterb%==%counter% goto ende
    set /a counterb=counterb+1
    goto ausgabe2
    :ende
    ps: ich weiß, dass der Thread schon einen monat alt ist, aber ich dachte drohnald kann es vielleicht trotzdem gebrauchen
     
    Last edited: Sep 21, 2008
Thread Status:
Not open for further replies.

Share This Page