Autor
|
Thema: Wörter in txt-Datei per batch suchen und ersetzen (10570 mal gelesen)
|
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005
|
erstellt am: 02. Mai. 2017 12:31 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, ich brauche Eure Hilfe bei folgendem Problem: Ich habe eine Text-Datei, welche immer den gleichen Namen hat, z.B. versuch.txt, aber je nach Situation unterschiedliche Inhalte. Nun möchte ich eine batch-Datei starten, welche in der versuch.txt nach einem bestimmten Wort bzw. Zeichenfolge (z.B. MAT_INHALT) sucht und diese dann mit einer festgelegten anderen Zeichenfolge (z.B. CAD_MAT_WERT) ersetzt. Alle anderen Texte sollen davon unberührt bleiben. Die zu ersetzende Zeichenfolge kann auch mal mitten in einer Zeile mit anderem Text zusammen stehen. Danach soll die versuch.txt gespeichert werden. Ich habe dazu folgenden Beitrag hier schon gefunden: http://ww3.cad.de/foren/ubb/Forum112/HTML/000130.shtml#000005 Allerdings komme ich damit nicht weiter. Da wird anscheinend immer eine ganze Zeile ersetzt und das möchte ich ja nicht. Beipsiel (stark verkürzt):
Inhalt von versuch.txt vor dem Ausführen der batch: /*** Werte sind im Material einzutragen MAT_INHALT="Stahl SJ235" OBERFLAECHE="verzinkt" Inhalt von versuch.txt nach dem Ausführen der batch: /*** Werte sind im Material einzutragen CAD_MAT_WERT="Stahl SJ235" OBERFLAECHE="verzinkt" ------------------ Grüße aus OWL, Thomas ProE macht Spaß - viel ProE macht viel Spaß ! (Zitat, frei nach meinem ProE-Beibringer) Neu auf CAD.de? Diese Infos werden Dir den Einstieg erleichtern: Willkommen auf CAD.de Auch sehr hilfreich für ProE-/Creo-Neulinge: ProE konfigurieren [Diese Nachricht wurde von EWcadmin am 02. Mai. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
highway45 Ehrenmitglied V.I.P. h.c. Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 don't read this
|
erstellt am: 02. Mai. 2017 13:06 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
|
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005
|
erstellt am: 02. Mai. 2017 13:11 <-- editieren / zitieren --> Unities abgeben:
Hi Matthias, wenn ich das von Hand mache möchte, nehme ich auch den notepad++ Ich möchte das aber quasi automatisch ablaufen lassen. Ziel ist es, diese batch später von Pro/ENGINEER bzw. Creo per mapkey aufzurufen. ------------------ Grüße aus OWL, Thomas ProE macht Spaß - viel ProE macht viel Spaß ! (Zitat, frei nach meinem ProE-Beibringer) Neu auf CAD.de? Diese Infos werden Dir den Einstieg erleichtern: Willkommen auf CAD.de Auch sehr hilfreich für ProE-/Creo-Neulinge: ProE konfigurieren Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3358 Registriert: 07.06.2001 W10-64bit, AMD Ryzen 7 3700X,32GB RAM, Sapphire Pulse Radeon RX 570 8G G5, Canon TX-3000 MFP, Maus Cherry MW4500, Sub:Infrastructure Design Suite, Office 365
|
erstellt am: 02. Mai. 2017 14:01 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
|
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005
|
erstellt am: 02. Mai. 2017 16:18 <-- editieren / zitieren --> Unities abgeben:
Ich habe es ohne Zusatzprogramm doch noch hinbekommen. Allerdings ersetzt das batch dann wirklich jede Zeichenfolge, also auch dann, wenn sie mitten in einem anderen Wort vorkommt. Beispiel: Gesucht wird UMFANG Soll ersetzt werden durch PERIMETER Der Text /*** Der Aussenumfang ist zu ermitteln: UMFANG=LENGTH:FID_AUSSENUMFANG sieht anschließend so aus: /*** Der AussenPERIMETER ist zu ermitteln: PERIMETER=LENGTH:FID_AUSSENPERIMETER Eigentlich sollte nur die Zeichenfolge UMFANG vor dem Gleichheitszeichen ersetzt werden. Das ist bei mir jetzt nicht so schlimm, ich lasse das einfach weg. In den drei anderen Fällen klappt die Ersetzung ja problemlos, da ich da nicht diese Gleichheit der Zeichenfolgen habe. Aber eine Lösung des Problems wäre schon schön ... schließlich hat man ja ein klein wenig Ehrgeiz, das alles funktioniert ------------------ Grüße aus OWL, Thomas ProE macht Spaß - viel ProE macht viel Spaß ! (Zitat, frei nach meinem ProE-Beibringer) Neu auf CAD.de? Diese Infos werden Dir den Einstieg erleichtern: Willkommen auf CAD.de Auch sehr hilfreich für ProE-/Creo-Neulinge: ProE konfigurieren Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Castell Mitglied Technical Advisor Engineering
Beiträge: 302 Registriert: 22.05.2000 Das Wissen der Menschen gehört der Menschheit.<P>SAP PLM, Notepad++, Windows 7
|
erstellt am: 02. Mai. 2017 17:50 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
Das in einer DOS Box zu realisieren ohne Zusatzprogramm geht meines erachtens nicht.Ich selbst denggel mir immer eine kleine ".exe" mit Hilfe von TCL/TK. Das geht natürlich auch mit jeder anderen Sprache. Versuch das Angehängte mal. Syntax: texttausch.exe versuch.txt MAT_INHALT CAD_MAT_WERT PS: Und schon wird man im Forum eines Besseren belehrt. Vielen Dank für die Folge-Posts
------------------ Viele Grüsse aus dem Schwabenländle Massimo Castell [Diese Nachricht wurde von Castell am 03. Mai. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Thomas Harmening Ehrenmitglied V.I.P. h.c. Arbeiter ツ
Beiträge: 2897 Registriert: 06.07.2001 Hier könnte eine Sysinfo stehen ;-)
|
erstellt am: 02. Mai. 2017 19:06 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
unten stehender Code in txt-Datei und Endung zu vbs ändern. per Drag and Drop auf die vbs wird der Inhalt geändert. bei mehreren Verschiedenen Ersetzungen Step 1 vervielfachen. Code:
strAppName = "RegExp Replace"Set objFSO = CreateObject("Scripting.FileSystemObject") For Each strArgument In WScript.Arguments Set objFile = objFSO.GetFile(strArgument) intFileSize = objFile.Size Set objFile = objFile.OpenAsTextStream() strFileContent = objFile.Read(intFileSize) objFile.Close
' *** Vorbereitung *** Set objRegExp = New RegExp ' Objekt für Verwendung von Regulären Ausdrücken erstellen objRegExp.Global = True ' True: In der gesamten Zeichenkette suchen objRegExp.IgnoreCase = True ' True: Groß/Kleinschreibung ignorieren 'Step 1 objRegExp.Pattern = "MAT_INHALT" 'X: strFileContent = objRegExp.Replace(strFileContent,"CAD_MAT_INHALT") Set objFile = objFSO.OpenTextFile(strArgument, 2) objFile.Write strFileContent objFile.Close MsgBox "Ersetzungen durchgenommen für " & strArgument & "!", vbOKOnly, strAppName Next
[Diese Nachricht wurde von Thomas Harmening am 02. Mai. 2017 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
highway45 Ehrenmitglied V.I.P. h.c. Bastler mit Diplom
Beiträge: 6331 Registriert: 14.12.2004 don't read this
|
erstellt am: 02. Mai. 2017 19:08 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
Zitat: Eigentlich sollte nur die Zeichenfolge UMFANG vor dem Gleichheitszeichen ersetzt werden.
Dann solltest du nicht UMFANG durch PERIMETER sondern UMFANG= durch PERIMETER= ersetzen. Kann aber sein, daß es mit Sonderzeichen nicht funktioniert. ------------------
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Castell Mitglied Technical Advisor Engineering
Beiträge: 302 Registriert: 22.05.2000 Das Wissen der Menschen gehört der Menschheit.<P>SAP PLM, Notepad++, Windows 7
|
erstellt am: 02. Mai. 2017 19:14 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
|
fritsrol Mitglied CAD-Systemingenieur
Beiträge: 143 Registriert: 11.12.2002 Windows 10 64 Office 2016 Eplan P8 2.7 HF2 VS 2015 Medusa 2000i2
|
erstellt am: 03. Mai. 2017 07:01 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
Hallo, hier habe ich noch einen Vorschlag für DOS Puristen: Rem leere Hilfsdatei erzeugen echo. > versuch2.txt for /F "tokens=*" %%a in (versuch.txt) do @call :dodir %%a type versuch2.txt ren versuch2.txt versuch.txt goto :eof REM Sub-Programm zum abarbeiten der gefundenen Zeilen :dodir echo. echo ************************************ echo **** found %1 ****
set orgstr=%1 REM *** Ersetzt in der aktuellen Zeile MAT_INHALT mit CAD_MAT_WERT. REM *** Problem ist aber ein '=' Zeichen set tmpstr=%orgstr:MAT_INHALT=CAD_MAT_WERT% echo %tmpstr% >> versuch2.txt echo. goto :eof Gruß Roland
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005
|
erstellt am: 03. Mai. 2017 08:36 <-- editieren / zitieren --> Unities abgeben:
Hallo Zusammen, erst mal vielen Dank für Eure Vorschläge. Ich freue mich doch immer wieder sehr, wie gut einem hier im Forum geholfen. Leider habe ich festgestellt, das die Einträge in den ursprünglichen Inhalten nicht immer gleich sind. Es gibt also folgende Schreibweisen, wobei der Eintrag nach den Zeichen /*** nur als Kommentar verarbeitet werden und daher nicht so relevant sind: /*** Festlegung Aussenumfang UMFANG = LENGTH:FID_AUSSENUMFANG /*** Berechnung vom Aussenumfang: UMFANG=LENGTH:FID_AUSSENUMFANG /*** Der Aussenumfang ist zu ermitteln: UMFANG=LENGTH:FID_AUSSENUMFANG Das macht die Sache jetzt nicht gerade einfacher. Das VBS-Script ist eine gute Idee und ich werde es testen. Allerdings sollte es in meinem Anwendungsfall nicht per Drag&Drop der Textdatei ausgeführt werden, sondern es wird per Aufruf aus dem CAD-Programm gestartet und nimmt sich dann die Textdatei selbst vor. Ich versuche mal, es mit meinen nicht vorhandenen bzw. äußerst spärlichen VBS-Kenntnissen hinzubekommen. Das batch von Roland muss ich mir noch anschauen und ausprobieren. ------------------ Grüße aus OWL, Thomas ProE macht Spaß - viel ProE macht viel Spaß ! (Zitat, frei nach meinem ProE-Beibringer) Neu auf CAD.de? Diese Infos werden Dir den Einstieg erleichtern: Willkommen auf CAD.de Auch sehr hilfreich für ProE-/Creo-Neulinge: ProE konfigurieren Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005 Creo 4.0 Parametric M150 Windchill 12.0.2.3 HP Z4 G4 mit 32GB RAM NVIDIA Quadro P4000 Windows 10 Enterprise
|
erstellt am: 03. Mai. 2017 08:44 <-- editieren / zitieren --> Unities abgeben:
Mir fällt gerade noch ein, das die zu ersetzende Zeichenfolge UMFANG immer am Anfang einer Zeile steht. Das ist bei den anderen drei Zeichenfolgen, welche ebenfalls ersetzt werden sollen, nicht generell der Fall. Vielleicht lässt sich das ja irgendwie nutzen. Werde mich heute mal damit beschäftigen. ------------------ Grüße aus OWL, Thomas ProE macht Spaß - viel ProE macht viel Spaß ! (Zitat, frei nach meinem ProE-Beibringer) Neu auf CAD.de? Diese Infos werden Dir den Einstieg erleichtern: Willkommen auf CAD.de Auch sehr hilfreich für ProE-/Creo-Neulinge: ProE konfigurieren Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Bernd P Ehrenmitglied V.I.P. h.c. cook-general
Beiträge: 3358 Registriert: 07.06.2001
|
erstellt am: 03. Mai. 2017 08:59 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
|
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005 Creo 4.0 Parametric M150 Windchill 12.0.2.3 HP Z4 G4 mit 32GB RAM NVIDIA Quadro P4000 Windows 10 Enterprise
|
erstellt am: 03. Mai. 2017 09:26 <-- editieren / zitieren --> Unities abgeben:
Danke für den Hinweis, Bernd ;-) Muss erst mal schauen ob ich exe-Dateien von unbekannter Herkunft hier überhaupt starten darf bzw. kann. Das batch von Roland funktioniert leider nicht. Es ersetzt zwar die entsprechende Zeichenfolge, aber es löscht auch in allen anderen Zeilen die Texte, die ja unverändert bleiben sollen. ------------------ Grüße aus OWL, Thomas ProE macht Spaß - viel ProE macht viel Spaß ! (Zitat, frei nach meinem ProE-Beibringer) Neu auf CAD.de? Diese Infos werden Dir den Einstieg erleichtern: Willkommen auf CAD.de Auch sehr hilfreich für ProE-/Creo-Neulinge: ProE konfigurieren Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fritsrol Mitglied CAD-Systemingenieur
Beiträge: 143 Registriert: 11.12.2002 Windows 10 64 Office 2016 Eplan P8 2.7 HF2 VS 2015 Medusa 2000i2
|
erstellt am: 03. Mai. 2017 09:35 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
|
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005
|
erstellt am: 03. Mai. 2017 10:04 <-- editieren / zitieren --> Unities abgeben:
|
Castell Mitglied Technical Advisor Engineering
Beiträge: 302 Registriert: 22.05.2000 Das Wissen der Menschen gehört der Menschheit.<P>SAP PLM, Notepad++, Windows 7
|
erstellt am: 03. Mai. 2017 10:58 <-- editieren / zitieren --> Unities abgeben: Nur für EWcadmin
Hallo. Ich denke, dass das Programm fnr.exe ist mächtig. Und wenn du schon keine fremden .exe einspielen darfst.... Egal, ich habe mein Skript angepasst. Jetzt ändert es nur wenn der Suchtext am Anfang steht. Und ich habe das Skript auch als Quelltext in das Zip abgelegt, damit eure Security reinschauen kann. texttausch.exe [Dateiname] Suchtext Neuer_Text texttausch.exe versuch.txt MAT_INHALT CAD_MAT_WERT ------------------ Viele Grüsse aus dem Schwabenländle Massimo Castell Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
EWcadmin Ehrenmitglied V.I.P. h.c. Konstrukteur (Dipl.-Ing. Maschinenbau), CAD-/PDM-Admin.
Beiträge: 3202 Registriert: 27.10.2005
|
erstellt am: 03. Mai. 2017 15:55 <-- editieren / zitieren --> Unities abgeben:
Vielen Dank für das script. Leider darf ich die exe nicht verwenden. Ich habe jetzt eine Lösung gefunden, die zwar nicht so elegant ist, aber durchaus ihren Zweck erfüllt. Innerhalb der FOR-Schleife habe ich zwei IF-Bedingungen, in denen die ganze Zeile verglichen wird und bei Übereinstimmung dann auch die ganze Zeile ersetzt wird. Wie gesagt, für uns reicht das in diesem Fall aus. hier die komplette FOR-Schleife als Auszug aus meiner batch:
Code:
for /f "usebackq delims=" %%i in ("%FILE%") do ( set "LINE=%%i" set LINE=!LINE:%SEARCH1%=%REPLACE1%! set LINE=!LINE:%SEARCH2%=%REPLACE2%! set LINE=!LINE:%SEARCH3%=%REPLACE3%! if "%%i"=="UMFANG=LENGTH:FID_AUSSENUMFANG" SET "LINE=CAD_PERIMETER=LENGTH:FID_AUSSENUMFANG" if "%%i"=="UMFANG = LENGTH:FID_AUSSENUMFANG" SET "LINE=CAD_PERIMETER=LENGTH:FID_AUSSENUMFANG" echo !LINE!>>"%FILE_TMP%" )
Die ersten drei strings werden automatisch ersetzt und das "Problemkind UMFANG" nur als ganze Zeile. Vielen Dank Euch allen für die Anregungen und Tipps. ------------------ Grüße aus OWL, Thomas ProE macht Spaß - viel ProE macht viel Spaß ! (Zitat, frei nach meinem ProE-Beibringer) Neu auf CAD.de? Diese Infos werden Dir den Einstieg erleichtern: Willkommen auf CAD.de Auch sehr hilfreich für ProE-/Creo-Neulinge: ProE konfigurieren Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |