kalle00
Goto Top

Verschiedene werte Suchen und mit einen Fixwert Erweitern- BATCH

Hallöchen, ich bräuchteein bisschen hilfe mit Suchen & Ersetzen, auf eine etwas andere art...

Ich habe eine Textdatei mit Folgenden Inhalt

Blub 20.008,50
Blub 510,-582
Blub 14,1.5
Blub -88,95


Blub [ZAHL],[ZAHL2]


usw.usf
und am ende soll die Datei folgendermaßen aussehen:

qweasd Q20.008,K50,ppp
qweasd Q510,K-582,ppp
qweasd Q14,K1.5,ppp
qweasd Q-88,K95,ppp


qweasd Q[ZAHL],K[ZAHL2],[EXTRA WERT]


Zur Zeit habe ich es soweit das das Blub in das qweasd umgewandelt wird, jedoch ist mein Problem nun das ich nicht nach den zahlen suchen kann und das Q und das K einfach davorsetzen kann. Vor die 1. Zahl soll IMMER das Q egal ob die zahl posetiv oder negativ ist. Und vor die 2. Zahl immer der K. Und als letztes soll überall ",ppp" angehängt werden.

nun meine frage: Ist dies umsetzbar in batch? mit "einer" einfach schleife, wonach ich einfach nach "den zahlen" suchen kann (nach dem Blub bzw. qweasd ist IMMER ein "blank" nach der 1. Zahl immer 1 "," (komma).
Denn für JEDE zahl eine extra schleife zu erstellen ist zwar theoretisch machbar, aber praktisch nicht umsetzbar, da es keine ahnung wieviele verschiedene zahlen sindface-smile

- denn per sufu habe ich nur "einfaches" suchen und ersetzen gefunden, aber nichts womit man mach [Arrays] sozusagen sucht.

MfG Maik aka Kalle

Schonmal Danke im Vorraus und ich hoffe es ist verständlich!

Content-Key: 159395

Url: https://administrator.de/contentid/159395

Printed on: April 19, 2024 at 22:04 o'clock

Member: bastla
bastla Jan 25, 2011 at 16:00:23 (UTC)
Goto Top
Hallo kalle00und willkommen im Forum!

Wenn, so wie ich das derzeit interpretiere, jede Zeile der Ausgangsdatei umzuwandeln ist, dann etwa so:
@echo off & setlocal
set "Alt=D:\Alt.txt"  
set "Neu=D:\Neu.txt"  

del "%Neu%" 2>nul  
for /f "usebackq tokens=1-3 delims=, " %%a in ("%Alt%") do >>"%Neu%" echo qweasd Q%%b,K%%c,ppp  
Wenn es allerdings so gemeint wäre, dass nur Zeilen, die mit "Blub " beginnen, verarbeitet werden sollen, stellt sich die Frage nach den übrigen (und ev auch leeren) Zeilen der Quelldatei ...

Grüße
bastla
Member: kalle00
kalle00 Jan 25, 2011 at 17:21:19 (UTC)
Goto Top
Vielen herzlichen dank für die Antwort!

und es ist so wie du unten beschrieben hast (wusst ichs doch das ich nicht alles beschrieben hatteface-smile), es sollen nur bestimmte zeilen umgewandelt werden, also z.B. nur die die mit Blub beginnen, Leerezeilen sind nicht vorhanden, aber noch andere zeilen diese beginnen anders.
(ausschnitt aus ausgangscode)
ma 20,10
da 100,10
ma 110,10
es -10,10,90,180
ma 110,20
da 110,60
ma 110,70

Blub war in disem falle ma.
Es sollen die ma, da, es etc. umgewandelt werden in das entsprechende qweasd für ma, abc für da usw.
- wobei das da am Ende genauso aussieht wie das ma (Blub) halt nur ohne ppp

Danke, Kalle


p.s. wie mache ich hier etwas in die "codeboxen"???

---> dankeface-smile , ... wenn man hoch Scrollt sieht man auch Fromatierungshilfe *lach*
Member: Biber
Biber Jan 25, 2011 at 17:28:21 (UTC)
Goto Top
[OT]
Moin kalle00,

willkommen im Forum.
Zitat von @kalle00:
p.s. wie mache ich hier etwas in die "codeboxen"???
Ich gehöre ja nicht zu kalauerfeindlichen Moderatoren hier, aber...
... wenn ich lese, dass ein neuer Nick namens kalle00 in meinen Bereichen etwas in die codeboxen machen will...

Wenn du einen Beitrag/Kommentar eingibst, wird dir in diesem Eingabefenster ein zusätzlicher Popup-Link "" angeboten.
Dort findest du unter anderem auch die so genannte .

Grüße
Biber
[/OT]
Member: bastla
bastla Jan 25, 2011 at 18:00:33 (UTC)
Goto Top
Hallo kalle00!

Dann muss ich alleredings nochmals nachhaken: Sollen die "ma" und "da" gleich verarbeitet werden, und für die "es" (hier folgen ja 4 Zahlenwerte) gibt es andere Vorschriften [Edit] ... wohl nicht, anstelle von "da" soll ja "abc" verwendet werden ... [/Edit]? Gibt es vielleicht auch noch ganz andere Zeilen, die einfach nur unverändert "mitgenommen" werden sollen?

Vielleicht könntest Du das nochmals anhand einer "Vorher / Nachher"-Gegenüberstellung deutlich machen ...

Grüße
bastla
Member: kalle00
kalle00 Jan 25, 2011 at 18:23:37 (UTC)
Goto Top
Hallo bastla,

Zeilen welche unverändert mitgenommen werden, gibt es keine! Es gibt aber ein par zeilen welche Rausgelöscht werden, dies habe ich aber schon Eingebaut.
Zwecks dem ES dies wird später ganz anderst aussehen! - genauers kann ich jetzt gerade nicht sagen, muss Morgen erst nochmal nachschauen.

Also dieses hier von dir:

@echo off & setlocal
set "Alt=D:\Alt.txt"  
set "Neu=D:\Neu.txt"  

del "%Neu%" 2>nul  
for /f "usebackq tokens=1-3 delims=, " %%a in ("%Alt%") do >>"%Neu%" echo qweasd Q%%b,K%%c,ppp  

Funktioniert, nur wenn man noch irgendwie etwas Einbauen damit nur die Zeilen mit z.B. "ma" bearbeitet werden wär es perfekt.

Es muss NICHT alles in einer For-schleife abgearbeitet werden, es reicht wenn eine Schleife halt nur die zeilen mit "ma" bearbeitet. Diese könnte man dann ja einfach mehrfach laufen lassen, entsprechend abgeändert. Ich hatte ja schon etwas womit ich explizit die "ma" Ersetzen kann, jedoch kam ich damit nicht weiter um die zahlen zu Erweitern.

Zwecks beispiel:
Vorher:
ma 20,10
da 100,10
ma 110,10
es -10,10,90,180
ma 110,20
da 110,60
ma 110,70

Nachher:
qweasd Q20,K10,ppp
abc Q100,K10
qweasd Q110,K10,ppp
//es wird später anders aussehen, wie genau kann ich jetzt im augenblick nicht genau sagen  //
qweasd Q110,K20,ppp
abc Q110,K60
qweasd Q110,K70,ppp

Grüße, Kalle
Member: Friemler
Friemler Jan 25, 2011 at 18:59:35 (UTC)
Goto Top
Hallo Kalle,

Versuche mal folgendes Skript:
@echo off

setlocal enabledelayedexpansion


set "Words=ma da"  
set "Substitutes=qweased abc"  
set "Add=1 0"  
set "AddStr=ppp"  

set "InputFile=input.txt"  
set "OutputFile=CON"  


type NUL > "%OutputFile%"  

for %%w in (%Words%) do (
  for /f "tokens=1*" %%s in ("!Substitutes!") do (  
    set "Word_%%w=%%s"  
    set "Substitutes=%%t"  
  )

  for /f "tokens=1*" %%a in ("!Add!") do (  
    if "%%a" equ "0" set "Add_%%w= "  
    if "%%a" equ "1" set "Add_%%w=%AddStr%"  
    set "Add=%%b"  
  )
)

for /f "usebackq tokens=1-3 delims=, " %%a in ("%InputFile%") do (  
  for %%w in (%Words%) do (
    if "%%a" equ "%%w" (  
      for /f "tokens=2 delims==" %%s in ('set Word_ ^| find "_%%w="') do (  
        for /f "tokens=2 delims==" %%x in ('set Add_ ^| find "_%%w="') do (  
          if "%%x" neq " " (  
            >>"%OutputFile%" echo %%s Q%%b,K%%c,%%x  
          ) else (
            >>"%OutputFile%" echo %%s Q%%b,K%%c  
          )
        )
      )
    )
  )
)

Die Variablen Words, Substitutes, Add und AddStr in den Zeilen 6 bis 9 musst Du anpassen, und zwar nach folgender Regel: In der Reihenfolge, in der Du die zu ersetzenden Wörter in die Variable Words einträgst, musst Du auch die Wörter, durch die sie ersetzt werden sollen in die Variable Substitutes eintragen. Für jedes Wort, bei dem in der Ausgabedatei am Zeilenende ppp (oder ein anderes Wort, siehe Variable AddStr) erscheinen soll, musst Du in der Variablen Add eine 1 eintragen, sonst eine 0. Die Reihenfolge der 1 und 0 muss auch wieder mit der Reihenfolge der Wörter in Words korrespondieren.

Ich hoffe das war verständlich. face-wink

Über die Variablen InputFile und OutputFile werden die Ein- und Ausgabedateien bestimmt. Ausgabedatei=CON => Ausgabe auf den Schirm

Um für jedes Wort in Words eine individuelle Erweiterung (statt ppp) zu definieren, müssen nur kleine Änderungen vorgenommen werden. Sag' dann Bescheid.


Gruß
Friemler
Member: bastla
bastla Jan 25, 2011 at 19:34:55 (UTC)
Goto Top
Hallo kalle00!

Dann etwa so:
@echo off & setlocal
set "Alt=D:\Alt.txt"  
set "Neu=D:\Neu.txt"  

del "%Neu%" 2>nul  
for /f "usebackq delims=" %%i in ("%Alt%") do (  
    for /f "tokens=1-3 delims=, " %%a in ("%%i") do (  
        set "Done="  
        if "%%a"=="ma" echo qweasd Q%%b,K%%c,ppp & set "Done=true"  
        if "%%a"=="da" echo abc Q%%b,K%%c & set "Done=true"  
        if not defined Done echo %%i
    )
)>>"%Neu%"  
Grüße
bastla

[Edit] Wie habe ich mir denn diese Verspätung eingehandelt? face-wink [/Edit]
Member: kalle00
kalle00 Jan 25, 2011 at 19:54:00 (UTC)
Goto Top
Vielen herzlichen Dank!

Das hilft um längen weiter.
Hatte kurz bevor du dies gepostet hattest einen kleinen Gedankenblitz wie ich es hätte vielleicht auch lösen können, hätte aber bis spät in die nacht gesessen *lach*.
Zwecks der individuellen erweiterung das wird verraussichtlich bei den "ES" dann sein aber da muss ich mir erstmal überlegen wie die am Ende genau aussehen sollen. Werde mich vorraussichtlich die tage nochmal melden falls ich hängeface-smile.

- Beitrage als gelöst werde ich noch nicht markieren, da die "ES" noch im raum stehenface-smile

Vielen dank Euch 2 für eure Hilfe.

Würd euch ja gern aufn Feierabendbierchen einladen, aber ich glaube ihr seid ein bisschen weit weg face-big-smile.

Danke, Kalle
Member: Friemler
Friemler Jan 25, 2011 at 20:03:10 (UTC)
Goto Top
Hallo Kalle,

ich stoße trotzdem mal mit Dir an :
289ac0449deb817ce2cbe7839797d03a

Gruß
Friemler
Member: kalle00
kalle00 Jan 25, 2011 at 20:07:05 (UTC)
Goto Top
*hihi*
Habe deins auch noch getestetface-smile.
Klappt auch einmandfrei! Und ist für mich auf die schneller sogar verständlicher als das vom Friemler ;). Zwecks den ES habe ich eben schon mein schwerpunkt gefunden, aber für mich reicht es heute! Ich mach Feierabend!!!

Naja schönen Abend, noch und nochmals Besten Dank!

Gruß Kalle
Member: kalle00
kalle00 Feb 21, 2011 at 13:21:43 (UTC)
Goto Top
Soha, erstmal sorry das ich mich so Spät wieder melde, jedoch hatte Ich ein par Probleme.
Nun habe ich Erfahren das sich etwas geändert hat, und mir dadruch einen großen Strich durch die Rechnung macht.
Und zwar das ES...

Ausgangscode:
Code1:
ma 2,0
da 2,16
da 6,16
ma 6,12
es -4,4,0,90
ma 10,12
da 10,4
ma 6,4
es 4,4,270,360
ma 6,0
da 2,0

Zum einen nach jeden es eine extra zeile welche den wert lll enthält
(hatte schon etwas per sufu gefunden gehabt, jedoch waren dort die gesamte zeile immer gleich, und bei mir nur ja der Zeilenanfang.)
Code2 (Musterergebniss).Schritt1
qweasd  2,0,ppp
abc 2,16
abc 6,16
qweasd  6,12,ppp
es -4,4,0,90
lll
ma 10,12
abc 10,4
qweasd  6,4,ppp
es 4,4,270,360
lll
qweasd  6,0,ppp
abc 2,0


Code2 (Musterergebniss).Schritt2
Und das 2. was gemacht werden muss, ist die ES umwandeln in T51 bzw. T52 dies ist abhängig von der 1. bzw. 2. zahl nach den es, wenn ein - (minus) vor der Zahl ist, dann muss T51 stehen ansonsten T52

qweasd  2,0,ppp
abc 2,16
abc 6,16
qweasd  6,12,ppp
T51 -4,4,0,90
lll
qweasd 10,12,ppp
abc 10,4
qweasd  6,4,ppp
T52 4,4,270,360
lll
qweasd  6,0,ppp
abc 2,0

p.s es können ruhig beide Schritte mit einmal abgearbeitet werden wenn dies mäglich ist, ansonsten auf mehreren durchläufen, dies ist egal.

- Schonmal Danke im voraus

Gruß Kalle.
Member: bastla
bastla Feb 21, 2011 at 16:27:29 (UTC)
Goto Top
Hallo kalle00!

Versuch es damit:
@echo off & setlocal
set "Alt=D:\Alt.txt"  
set "Neu=D:\Neu.txt"  

del "%Neu%" 2>nul  
for /f "usebackq delims=" %%i in ("%Alt%") do (  
    for /f "tokens=1-5 delims=, " %%a in ("%%i") do (  
        set "Done="  
        if "%%a"=="ma" echo qweasd %%b,%%c,ppp & set "Done=true"  
        if "%%a"=="da" echo abc %%b,%%c & set "Done=true"  
	if "%%a"=="es" (  
	    if %%b lss 0 (echo T51 %%b,%%c,%%d,%%e) else (echo T52 %%b,%%c,%%d,%%e)
            echo lll
            set Done=True
        )
        if not defined Done echo %%i
    )
)>>"%Neu%"  
Grüße
bastla
Member: Friemler
Friemler Feb 21, 2011 at 16:31:31 (UTC)
Goto Top
Hallo Kalle,

bastla's Script lässt sich sehr leicht an Deine neuen Wünsche anpassen.

Zeile 7 muss lauten:
for /f "tokens=1-5 delims=, " %%a in ("%%i") do (

Hinter Zeile 10 (als neue Zeile 11) muss folgendes eingefügt werden:
if "%%a"=="es" (if %%b lss 0 (echo T51 %%b,%%c,%%d,%%e) else (echo T52 %%b,%%c,%%d,%%e)) & (echo lll) & set "Done=true"

Weitere Änderungen solltest Du eigentlich selbst hin bekommen face-wink.

[EDIT]
Oh, zu spät!
[/EDIT]

Gruß
Friemler
Member: bastla
bastla Feb 21, 2011 at 16:43:14 (UTC)
Goto Top
@Friemler
Passt so stilistisch besser als mein Zusatz ... face-smile

Grüße
bastla
Member: Biber
Biber Feb 21, 2011 at 16:53:54 (UTC)
Goto Top
[OT]
@bastla, @Friemler
Eigentlich vermisse ich -ebenfalls stilistisch- den dezenten Hinweis:
"Hey, wieso hast du nicht vor einem Monat schon gesagt, dass du unsere Ausführungen weder gelesen noch verstanden hast?"

@kalle00
Dieser feedbacklose Beitrag steht schon ein paar Tage auf meiner Beobachtungsliste.
Und er steht nur deshalb nicht bis zu den Knöcheln im Kompost, weil er IMHO auch ohne (d)ein Feedback durchaus hilfreich für einige MitleserInnen sein kann.

Ich bitte dich dennoch, dieses Mal dranzubleiben, bis auch die Verständisfragen geklärt sind und den Beitrag dann auch als "erledigt" zu kennzeichnen.

Beim Thema "nur mal schnell ein Copy&Paste als eigene Leistung ausgeben" - Ja Hey! Heisst du etwa auch "Kalle von und zu Irgendwas"??.
Na also...

Grüße
Biber
[/OT]
Member: kalle00
kalle00 Feb 21, 2011 at 17:19:06 (UTC)
Goto Top
Ersteinmal Danke für die Antwort.
Dann Entschuldigung das ich im Krankenhaus lag und kein Feedback geben konnte.
Zwecks nicht verstehen, dies war am anfang zum Teil so, aber mittlerweile geht es und einfaches Copy&Past tue ich auch nicht. Zum einen hatder Lösungvorschlag vom Friemler mir bei mein ersten Problem geholfen. Und zum anderen steht der Thread u.a. auch in meiner Qulle drinn. Dies ist nun aber dahinngestellt.

Nochmals Danke & Gruß Kalle

p.s. werde vorraussichtich spätestens Freitag den Thread als gelöst makieren.