String wird nicht in die zweite Text datei kopiert
Hallo zusammen,
es geht um folgende, ich möchte eine vcf-List Datei in einzelne vcfDateien splitten.
Dafür habe ich mir auch schon ein Bacth Skript zusammen gebastelt, welches auch soweit funktioniert, allerdings habe ich nun das Problem, das das Skript scheinbar immer dann abbricht, wenn in dem ausgelesen String ein ';' vorkommt.
Zur weiteren Info: lmod ist ein Tool, welches nichts anderes macht, als eine Zeile x (Parameter: /L) anstatt auf dem Bildschirm auszugeben in eine Datei umleitet
Aber hier erstmal das Skript:
SET "end="
SET "counter=1"
SET "filecount=1"
SET "global=0"
:begin
IF %global% == %2 GOTO :clean
TYPE %1 | lmod /E /L%counter% > tmp.dat
FOR /F %%i in (tmp.dat) do set "end=%%i"
more tmp.dat >> %filecount%.vcf
IF %end% == END:VCARD GOTO :newfile
SET /a counter=counter+1
GOTO :begin
:newfile
SET /a counter=counter+2
SET /a filecount=filecount+1
SET /a global=global+1
GOTO :begin
:clean
del tmp.dat
So das problem stellt sich nun so dar, das er scheinbar immer dann abbricht, wenn er die Zeile 'more tmp.dat >> %filecount%.vcf' abarbeitet und sich in der tmp.dat ein String befindet, in dem ein Semikolon vorkommt.
Nun noch der Vollständigkeit halber ein Beispiel, wie ein vcf Datensatz aussieht:
BEGIN:VCARD
VERSION:2.1
N:Mustermann;Hans
FN:Hans Mustermann
ORG:Muster GmbH
ADR;WORK:;;Mustergasse 11;Musterstadt;Bundesland;88888;Deutschland
BDAY:19871031
TEL;HOME:+49 8888888888
EMAIL:h.Mustermann@gmx.de
TEL;CELL:+49 0160888888888
END:VCARD
Ich hoffe ihr könnt mir da ein bsichen helfen.
P.S. das ist mein erstes batch Skript, ich bin also für Verbesserungsvorschläge offen.
Gruß,
Rangald
es geht um folgende, ich möchte eine vcf-List Datei in einzelne vcfDateien splitten.
Dafür habe ich mir auch schon ein Bacth Skript zusammen gebastelt, welches auch soweit funktioniert, allerdings habe ich nun das Problem, das das Skript scheinbar immer dann abbricht, wenn in dem ausgelesen String ein ';' vorkommt.
Zur weiteren Info: lmod ist ein Tool, welches nichts anderes macht, als eine Zeile x (Parameter: /L) anstatt auf dem Bildschirm auszugeben in eine Datei umleitet
Aber hier erstmal das Skript:
SET "end="
SET "counter=1"
SET "filecount=1"
SET "global=0"
:begin
IF %global% == %2 GOTO :clean
TYPE %1 | lmod /E /L%counter% > tmp.dat
FOR /F %%i in (tmp.dat) do set "end=%%i"
more tmp.dat >> %filecount%.vcf
IF %end% == END:VCARD GOTO :newfile
SET /a counter=counter+1
GOTO :begin
:newfile
SET /a counter=counter+2
SET /a filecount=filecount+1
SET /a global=global+1
GOTO :begin
:clean
del tmp.dat
So das problem stellt sich nun so dar, das er scheinbar immer dann abbricht, wenn er die Zeile 'more tmp.dat >> %filecount%.vcf' abarbeitet und sich in der tmp.dat ein String befindet, in dem ein Semikolon vorkommt.
Nun noch der Vollständigkeit halber ein Beispiel, wie ein vcf Datensatz aussieht:
BEGIN:VCARD
VERSION:2.1
N:Mustermann;Hans
FN:Hans Mustermann
ORG:Muster GmbH
ADR;WORK:;;Mustergasse 11;Musterstadt;Bundesland;88888;Deutschland
BDAY:19871031
TEL;HOME:+49 8888888888
EMAIL:h.Mustermann@gmx.de
TEL;CELL:+49 0160888888888
END:VCARD
Ich hoffe ihr könnt mir da ein bsichen helfen.
P.S. das ist mein erstes batch Skript, ich bin also für Verbesserungsvorschläge offen.
Gruß,
Rangald
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 57268
Url: https://administrator.de/contentid/57268
Ausgedruckt am: 23.11.2024 um 02:11 Uhr
12 Kommentare
Neuester Kommentar
Moin Rangald,
willkommen im Forum.
Ich denke, Du bist bei der Vermutung nach der "Fehler"-Ursache auf der falschen Fährte.
Ich denke, es sind zwei andere Fehlerursachen, die eher handwerklicher Natur sind (keine Dankfehler).
1) Falls in einer Zeile Leerzeichen enthalten sind, würde davor auch das erste Token der FOR /F-Anweisung (%%i) enden.
Beispiel am CMD-Prompt:
Ich denke, Du siehst den Unterschied - Du solltest "delims=" als Klausel einbauen in Deine FOR/F-Anweisung.
2) Bei der IF-Prüfung der Variablen solltest Du diese Syntax verwenden:
Das verhindert einen Syntaxfehler, falls mal die Variable %end% leer ist oder aus mehreren "Worten" besteht.
Probier es mal mit diesen beiden Änderungen bitte und poste das Ergebnis.
Gruss
Biber
willkommen im Forum.
Ich denke, Du bist bei der Vermutung nach der "Fehler"-Ursache auf der falschen Fährte.
Ich denke, es sind zwei andere Fehlerursachen, die eher handwerklicher Natur sind (keine Dankfehler).
1) Falls in einer Zeile Leerzeichen enthalten sind, würde davor auch das erste Token der FOR /F-Anweisung (%%i) enden.
Beispiel am CMD-Prompt:
$cmd$type vcard.txt
BEGIN:VCARD
VERSION:2.1
N:Mustermann;Hans
FN:Hans Mustermann
ORG:Muster GmbH
ADR;WORK:;;Mustergasse 11;Musterstadt;Bundesland;88888;Deutschland
BDAY:19871031
TEL;HOME:+49 8888888888
EMAIL:h.Mustermann@gmx.de
TEL;CELL:+49 0160888888888
END:VCARD
Z:\>
$cmd$FOR /F %i in (vcard.txt) do @echo "%i"
"BEGIN:VCARD"
"VERSION:2.1"
"N:Mustermann;Hans"
"FN:Hans"
"ORG:Muster"
<b>"ADR;WORK:;;Mustergasse"</b>
"BDAY:19871031"
"TEL;HOME:+49"
"EMAIL:h.Mustermann@gmx.de"
"TEL;CELL:+49"
"END:VCARD"
Z:\>
$cmd$FOR /F <b>"delims="</b> %i in (vcard.txt) do @echo "%i"
"BEGIN:VCARD"
"VERSION:2.1"
"N:Mustermann;Hans"
"FN:Hans Mustermann"
"ORG:Muster GmbH"
"ADR;WORK:;;Mustergasse 11;Musterstadt;Bundesland;88888;Deutschland"
"BDAY:19871031"
"TEL;HOME:+49 8888888888"
"EMAIL:h.Mustermann@gmx.de"
"TEL;CELL:+49 0160888888888"
"END:VCARD"
Ich denke, Du siehst den Unterschied - Du solltest "delims=" als Klausel einbauen in Deine FOR/F-Anweisung.
2) Bei der IF-Prüfung der Variablen solltest Du diese Syntax verwenden:
REM :::::: Wackelige Prüfung: IF %end% == END:VCARD
IF [%end%] == [END:VCARD] goto....
::- oder besser -
IF "%end%" == "END:VCARD" goto ...
Das verhindert einen Syntaxfehler, falls mal die Variable %end% leer ist oder aus mehreren "Worten" besteht.
Probier es mal mit diesen beiden Änderungen bitte und poste das Ergebnis.
Gruss
Biber
Moin Rangald,
noch ein Verweis zu einer Antwort auf Deine Frage Was bedeutet/bewirkt "delims="?...
Aus der Hilfe zur FOR-Anweisung ("FOR /?" am CMD-Prompt);
Gruss
Biber
noch ein Verweis zu einer Antwort auf Deine Frage Was bedeutet/bewirkt "delims="?...
Aus der Hilfe zur FOR-Anweisung ("FOR /?" am CMD-Prompt);
For /?
skip=n - Gibt die Anzahl der Zeilen an, die am Anfang einer
Datei übersprungen werden.
delims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen
die Standardtrennzeichen TAB und Leerzeichen.
tokens=x,y,m-n - Gibt an, welche Token von jeder Zeile an die
FOR-Schleife weitergegeben werden.
skip=n - Gibt die Anzahl der Zeilen an, die am Anfang einer
Datei übersprungen werden.
delims=xxx - Gibt einen Satz von Trennzeichen an. Diese ersetzen
die Standardtrennzeichen TAB und Leerzeichen.
tokens=x,y,m-n - Gibt an, welche Token von jeder Zeile an die
FOR-Schleife weitergegeben werden.
Gruss
Biber
...wobei ich ungern darauf verzichte, das letzte Wort zu haben...
Wenn es nun tatsächlich unkalkulierbar oder von zufälligen Konstellationen abhängig sein sollte, ob nun der zurückgegebene String ein oder zwei Leerzeichen enthält,
weil mal eine Datei in der Form xx.txt und mal in der Form x:\pfad\xx.txt übergeben wird, dann:
[Wobei bastla natürlich recht hat: bei der Datei tmp.dat oben im Beispiel müsste "Tokens=2" gesetzt werden.
Ebenso bei allen Dateien ohne explizite Laufwerksangabe und allen UNC-Pfadangaben wie "\\meinsörva\schehr" etc.]
Gruss Biber
Wenn es nun tatsächlich unkalkulierbar oder von zufälligen Konstellationen abhängig sein sollte, ob nun der zurückgegebene String ein oder zwei Leerzeichen enthält,
weil mal eine Datei in der Form xx.txt und mal in der Form x:\pfad\xx.txt übergeben wird, dann:
for /f "delims=: tokens=1,*" %%i in ('find /i /c "suchstring" dateiname.txt') do @for %%j in (%%j) do @set /a anzahl=%%j
[Wobei bastla natürlich recht hat: bei der Datei tmp.dat oben im Beispiel müsste "Tokens=2" gesetzt werden.
Ebenso bei allen Dateien ohne explizite Laufwerksangabe und allen UNC-Pfadangaben wie "\\meinsörva\schehr" etc.]
Gruss Biber