gijukud6
Goto Top

Wörter in Anführungsstrichen in einer Zeile einer txt in einem anderen Format in neue txt schreiben

Hallo,

es gibt eine Menge Fragen, die dieses Thema behandeln, aber da ich bezüglich Batch-Dateien nicht viel Ahnung habe und mein Problem etwas spezieller ist, konnte ich mir aus den Themen nicht die Lösung zusammenbasteln... Hoffe ihr könnt mir helfen:

Ich habe eine txt Datei, die in jeder Zeile eine Menge stehen hat, unter anderem auch Host:"derhost" sowie Passwort:"daspw" und User:"deruser".
Nun bräuchte ich eine Batch, die jede Zeile dieser txt Datei ausliest und diese Information in eine neue txt Datei schreibt im Format:
ftp://deruser:daspw@derhost

Hier die ersten 3 Zeilen der Datei. Jede weitere Zeile ist gleich aufgebaut, aber die "Variablen" sind logischerweise unterschiedlich lang.

<Site Name="apple" Host="apple.com" Port="21" User="stevey" RemoteDir="" LocalDir="" Pass="01807254095081091089001004" Logontype="1" FWBypass="0" DontSavePass="0" ServerType="0" PasvMode="0" TimeZoneOffset="0" TimeZoneOffsetMinutes="0" Comments="" UTF8="0" DefaultSite="0"/>  
<Site Name="google" Host="google.com" Port="21" User="eric666" RemoteDir="" LocalDir="" Pass="0990850700690640857075084116118112" Logontype="1" FWBypass="0" DontSavePass="0" ServerType="0" PasvMode="0" TimeZoneOffset="0" TimeZoneOffsetMinutes="0" Comments="" UTF8="0" DefaultSite="0"/>  
<Site Name="microsoft" Host="microsoft.com" Port="21" User="billG" RemoteDir="" LocalDir="" Pass="02209478064088124084068083" Logontype="1" FWBypass="0" DontSavePass="0" ServerType="0" PasvMode="0" TimeZoneOffset="0" TimeZoneOffsetMinutes="0" Comments="" UTF8="0" DefaultSite="0"/>  

Vielen Dank für Hilfe
Gruß

Content-Key: 113538

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

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

Member: bastla
bastla Apr 08, 2009 at 16:43:23 (UTC)
Goto Top
Hallo gijukud6 und willkommen im Forum!

Gibt es in den Zeilen irgend eine Systematik (etwa: fixe Wortanzahl bzw Zeichenanzahl/Zeichenposition; oder: nur nach "Host", "Passwort" und "User" befindet sich ein ":")?

Es wäre auch hilfreich, wenn Du einige Beispielzeilen (mit anonymisierten Daten) in -Formatierung posten könntest ...

Grüße
bastla
Member: colinardo
colinardo Apr 08, 2009 at 18:36:56 (UTC)
Goto Top
Folgendes Visual Basic Script solte dir helfen:
Nach deinen Formatvorgaben sucht das Script nach den folgenden Textstellen :
User=
Pass=
Host=
und extrahiert alles was danach zwischen den Anführungszeichen folgt.

Du musst nur noch den Pfad für die Textdatei in Zeile 2 des Codes anpassen.
Nach dem Aufruf findest du eine Textdatei im Ordner des Scriptes, du kannst den Pfad aber auch in Zeile 3 des Codes anpassen!
Set fso = CreateObject("scripting.filesystemobject")  
Set source_file = fso.OpenTextFile("text.txt",1)  
Set target_textfile = fso.OpenTextFile("processed_file.txt",2,true)  
Do Until source_file.AtEndOfStream
	line = source_file.ReadLine
	pos_content_user = InStr(1,line,"User=",1)+6  
	len_content_user = InStr(pos_content_user, line, Chr(34)) - pos_content_user
	pos_content_pass = InStr(1,line,"Pass=",1)+6  
	len_content_pass = InStr(pos_content_pass, line, Chr(34)) - pos_content_pass
	pos_content_host = InStr(1,line,"Host=",1)+6  
	len_content_host = InStr(pos_content_host, line, Chr(34)) - pos_content_host
	
	user = Mid(line,pos_content_user, len_content_user)
	pass = Mid(line,pos_content_pass, len_content_pass)
	host = Mid(line,pos_content_host, len_content_host)
	target_textfile.WriteLine "ftp://" & user & ":" & pass & "@" & host  
Loop
MsgBox "Feddich..."  
source_file.Close
target_textfile.Close

Wünsche weiterhin viel Erfolg !
Member: gijukud6
gijukud6 Apr 08, 2009 at 18:53:55 (UTC)
Goto Top
Danke vielmals Softmeister, das hat (trotz fehlermeldung) funktioniert.
Trotzdem würde ich gern interessehalber wissen, wie man das Problem mittels Batch gelöst hätte.
Member: bastla
bastla Apr 08, 2009 at 19:55:43 (UTC)
Goto Top
Hallo gijukud6!

Ich hätte zwar auch eher VBS als Batch gewählt, aber es könnte - soferne es keine zusätzlichen Leerzeichen zwischendurch (etwa im Wert von "Site Name" oder "LocalDir") gäbe - so klappen:
@echo off & setlocal
set "Ein=D:\text.txt"  
set "Aus=D:\processed_file.txt"  

if exist "%Aus%" del "%Aus%"  
for /f "usebackq tokens=3,5,8" %%i in ("%Ein%") do for /f "tokens=2,4,6 delims==" %%a in ("%%j=%%k=%%i") do >>"%Aus%" echo ftp://%%~a:%%~b@%%~c  
Grüße
bastla
Member: gijukud6
gijukud6 Apr 08, 2009 at 20:45:44 (UTC)
Goto Top
Dankesehr, es funktioniert!
Eine Bitte hab ich noch: Könntest du mir bitte die letzte Zeile deiner Batch ein wenig erläutern?
Member: bastla
bastla Apr 08, 2009 at 20:57:26 (UTC)
Goto Top
Hallo gijukud6!
for /f "usebackq tokens=3,5,8" %%i in ("%Ein%") do
Gehe alle Zeilen der in der Klammer angegebenen Datei (da diese unter Anführungszeichen - für den Fall, dass Name oder Pfad Leerzeichen enthielten - steht muss, zur Unterscheidung von einem Text, "usebackq" verwendet werden) durch und entnehme die (durch die Default-Trennzeichen Leerzeichen bzw TAB) Teile 3, 5 und 8 als Variable %%i und alphabtisch folgende - Ergebnis für die erste Zeile:
%%i: Host="apple.com"
%%j: User="stevey"
%%k: Pass="01807254095081091089001004"
Da die Werte jeweils durch ein "=" vom Namen getrennt sind, wird mit der nächsten "for /f"-Schleife anhand dieses Zeichens getrennt - der Einfachheit halber wird das Trennzeichen auch zwischen die einzelnen Namen-/Wert-Kombinationen (bereits in der benötigten Reihenfolge angegeben) gesetzt:
for /f "tokens=2,4,6 delims==" %%a in ("%%j=%%k=%%i") do
- zerlegt wird daher
User="stevey"=Pass="01807254095081091089001004"=Host="apple.com"
Da nur die Werte interessieren, werden die "tokens" 2 ("stevey"), 4 ("01807254095081091089001004") und 6 ("apple.com") verwendet, um das gewünschte Ergebnis in die Ausgabedatei zu schreiben:
>>"%Aus%" echo ftp://%%~a:%%~b@%%~c
Die Schreibweise "%%~a" entfernt schließlich noch die umgebenden Anführungszeichen.
Wenn Du übrigens das "echo off" auf "echo on" änderst, erhältst Du die einzelnen Befehlszeilen (mit "aufgelösten" Variablen) vor der Ausführung angezeigt. Starten solltest Du den Batch (beim Testen ohnehin immer) dazu dirket von der Kommandozeile.

Grüße
bastla