maffi
Goto Top

Zeilen und Spalten finden per Batch

Hallo liebe Gemeinde, ich habe folgendes Problem, ich habe ein Programm was mir folgende daten in einer datei ausgibt:

01380006100
014810000284
017300000002231
017360000002231
0152002Privat
0173101Testmann
0173301Testmann
0133102Otto
0133302Otto
017310312021945
0153303120245
023310644141 Dortmund
023330644141 Dortmund
0253107Wetsfalendamm 40
0253307Wetsfalendamm 40
01031101
01036211
01380006200
014810000102
017300000002231
017360000002231
014410400000
017620006012009
0108404N

Testmann ist der Nachname und Otto der vorname, die zahlen sind von kunde zu kunde anders, ich brauche nur den vor und nachnamen in einem textdukument, die zahlen sind immer andes, ich müsste quasi nach buchstaben suchen, die zeilen bleiben eig. immer gleich nur die zahlen könnten mal mehr oder mal weniger sein.

Danke im Vorraus
Manuel

Content-Key: 105334

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

Printed on: April 18, 2024 at 11:04 o'clock

Mitglied: 60730
60730 Jan 06, 2009 at 16:50:37 (UTC)
Goto Top
Servus,

wenn ich den Inhalt der Datei und deine Frage richtig verstehe willst du alle Nicht Nummern aus der Textdatei herauslösen.
Aber woher soll das Script dann zwischen Vor/Nach Namen und Ortsangaben unterscheiden?

Bzw. Westfalendamm 40 - ganz ohne (Haus)Nummer ?

Führe dein "problem" doch bitte etwas genauer aus.

Gruß
Member: Maffi
Maffi Jan 06, 2009 at 17:18:19 (UTC)
Goto Top
Ich brauch nur den vor und nachnamen, unterscheiden könnte man das mit den zeilen, die sind immer gleich, die nummer, die straße ect. brauch ich nicht, mir reich vor und nachname in einer textdatei am besten untereinander.
Mitglied: 60730
60730 Jan 06, 2009 at 17:22:57 (UTC)
Goto Top
ich versteh dich nicht.
und mir widerstrebt es eigentlich Grußlos begrüßt zu werden

0173101Testmann
0173301Testmann
0133102Otto
0133302Otto
017310312021945
0153303120245
023310644141 Dortmund
023330644141 Dortmund
0253107Wetsfalendamm 40
0253307Wetsfalendamm 40

Ich brauch nur den vor und nachnamen
?
unterscheiden könnte man das mit den zeilen, die sind immer gleich
???
0173101 ist ungleich 0133102 und ungleich 023310644141 und unterscheidet sich auch von 0253107

Führe dein "problem" doch bitte etwas genauer aus.
war offensichtlich falsch Formuliert.

* Bist du dir sicher, das die Daten passen?
* Aber woher soll das Script dann zwischen Vor/Nach Namen und Ortsangaben unterscheiden?

Grußlos zurück
Member: Maffi
Maffi Jan 06, 2009 at 17:28:05 (UTC)
Goto Top
ich habe das:

Pat.bdt inhalt:
01380006100
014810000284
017300000002231
017360000002231
0152002Privat
0173101Testmann
0173301Testmann
0133102Otto
0133302Otto
017310312021945
0153303120245
023310644141 Dortmund
023330644141 Dortmund
0253107Wetsfalendamm 40
0253307Wetsfalendamm 40
01031101
01036211
01380006200
014810000102
017300000002231
017360000002231
014410400000
017620006012009
0108404N

und daraus möchte ich haben
pat.txt
Testmann
Otto

hier mal eine andere pat.bdt

01380006100
014810000287
017300000006703
017360000006703
0282002AOK Westfalen-Lippe
0153101Abano
0153301Abano
0143102Daniel
0143302Daniel
017310307091998
0153303070998
023310658239 Musterstadt
023330658239 Musterstadt
0213107Klusenweg 5a
0213307Klusenweg 5a
01031102
01036212
01380006200
014810000102
017300000006703
017360000006703
014410418111
017620006012009
0108404N
Mitglied: 60730
60730 Jan 06, 2009 at 17:34:37 (UTC)
Goto Top
In der einen Datei sind die gesuchten Infos in Zeile 7 & 8 in der anderen wohl auch?

richtig [_]
falsch [_]

und sind die gesuchten Daten immer in Zeile 7 und 8?

richtig [_]
falsch [_]
Member: Maffi
Maffi Jan 06, 2009 at 17:39:38 (UTC)
Goto Top
mhh ist das nicht ein und die selbe frage nur anders formuliert? aber

richtig
richtig
Member: bastla
bastla Jan 06, 2009 at 18:37:48 (UTC)
Goto Top
Hallo Maffi und TimoBeil!

Wenn aus den Zeilen 7 und 8 demnach jeweils der Zeileninhalt ab der ersten "Nicht-Ziffer" benötigt wird, könnte das etwa so gehen:
@echo off & setlocal
set "Ein=D:\Pat.bdt"  
set "Aus=D:\Pat.txt"  
set "Zeilen=7,8"  

set "Ziffern=0123456789"  
if exist "%Aus%" del "%Aus%"  

for %%i in (%Zeilen%) do for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "%%i:"') do set "Zeile=%%b" & call :ProcessLine %%i  
goto :eof

:ProcessLine
if not defined Zeile goto :Error
set /a Z=-1
:Loop
set /a Z+=1
call set Zeichen=%%Zeile:~%Z%,1%%
if not defined Zeichen goto :Error
echo %Ziffern%|findstr "%Zeichen%">nul && goto :Loop  

call set "Name=%%Zeile:~%Z%%%"  
>>"%Aus%" echo %Name%  
goto :eof

:Error
echo In Zeile %1: "%Zeile%" konnte kein Name gefunden werden!  
pause
goto :eof
Für den Fehlerfall (Zeile 7 oder 8 enthält nur Ziffern oder ist leer) wird derzeit nur eine Fehlermeldung ausgegeben (und auf einen Tastendruck gewartet).

Grüße
bastla

[Edit] Fehlerbehandlung etwas verbessert [/Edit]
Member: miniversum
miniversum Jan 07, 2009 at 13:09:01 (UTC)
Goto Top
Wenn ich mir die dateien so ansehe drängt sich mir der Verdacht auf das die Zahlen davor immer 7Stellig sind. Wenn das wirklich das Fall wäre wäre die ganze sucherei auch unnötig und würde das ganze wesentlich vereinfachen. Aber das kann nur Maffi (Manuel) beantworten.
Member: bastla
bastla Jan 07, 2009 at 13:13:51 (UTC)
Goto Top
@miniversum

Hatte ich aufgrund von
die zeilen bleiben eig. immer gleich nur die zahlen könnten mal mehr oder mal weniger sein.
anders interpretiert (und wäre ansonsten auch weniger spannend gewesen face-wink) - allerdings kann das wirklich nur Maffi genau wissen ...

Grüße
bastla
Mitglied: 60730
60730 Jan 07, 2009 at 14:22:10 (UTC)
Goto Top
Servus Bastla & Miniversum & Maffi,

das mit den 7stellen (wenn es denn so wäre) macht aber auch nichts denn die Strasse hat auch nur 7 stellen.
Bzw. offensichtlich jede "zahlenkollone" besteht aus 7 Nummern - bei manchen folgt eine Nummer (PLZ).

Da ich gestern meine Frage falsch gestellt habe - versuche ichs also nochmal:

In der einen Datei sind die gesuchten Infos sowohl in Zeile 6 & 7 sowie in 8 & 9.

Gruß
Member: Maffi
Maffi Jan 07, 2009 at 15:29:26 (UTC)
Goto Top
Also es können auch mal mehr zahlen sein, vor den Namen, Ja sowohl in Zeile 6&7 als auch in 8 &9 sind die daten vorhanden.

Das Script läuft super, dankeschön, nur noch eine kleine frage, den vornamen finde ich in der Variable %name% finde ich auch irgendwo den Nachnamen? würde gerne von da aus weitergehen, ohne über die txt zu gehen.

gruß Manuel
Member: bastla
bastla Jan 07, 2009 at 15:50:43 (UTC)
Goto Top
Hallo Maffi!

Ersetze das "Hauptprogramm" (die Zeilen 1 bis 10) durch
@echo off & setlocal
set "Ein=D:\Pat.bdt"  
set "Aus=D:\Pat.txt"  

set "Ziffern=0123456789"  
if exist "%Aus%" del "%Aus%"  

for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "7:"') do set "Zeile=%%b" & call :ProcessLine %%i  
set "Nachname=%Name%"  
for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "8:"') do set "Zeile=%%b" & call :ProcessLine %%i  
set "Vorname=%Name%"  
:: Ab hier, was denn sonst noch so anliegt ...
::
::
goto :eof
Zur Sicherheit vielleicht noch ein
set Name=
unmittelbar an den Anfang des Unterprogrammes ":ProcessLine" - dann kannst Du nach jeder "for"-Schleife einfach kontrollieren, ob ein Name extrahiert werden konnte und entsprechend darauf reagieren (zB vor Zeile 9 neu):
if not defined Name echo Kein Zuname gefunden & pause & goto :eof
Das würde dann auch das allgemeine Error-Handling im Unterprogramm überflüssig machen (anstelle von "goto :Error" einfach "goto :eof") ...

Grüße
bastla

[Edit] Fehlende Anführungszeichen in den Zeilen 9 und 11 ergänzt. [/Edit]
Member: Maffi
Maffi Jan 12, 2009 at 09:46:26 (UTC)
Goto Top
Wenn ich die Variablen Vorname und Nachname ausgebe, sagt er mir, sie seien leer???
Member: bastla
bastla Jan 12, 2009 at 12:21:55 (UTC)
Goto Top
Hallo Maffi!

Die (bis vorhin face-wink) in den Zeilen 9 und 11 am Ende fehlenden Anführungszeichen sollten eigentlich nicht der Grund dafür sein ...

Poste doch bitte einmal den aktuellen Stand Deines Batches (vorzugsweise zwischen -Tags).

Grüße
bastla
Member: Maffi
Maffi Jan 12, 2009 at 15:33:25 (UTC)
Goto Top
hier mal der relevante teil
[code]
setlocal
set "Ein=D:\Pat.bdt"
set "Aus=D:\Pat.txt"

set "Ziffern=0123456789"
if exist "%Aus%" del "%Aus%"

for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "7:"') do set "Zeile=%%b" & call :ProcessLine %%i
set "Nachname=%Name%
for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "8:"') do set "Zeile=%%b" & call :ProcessLine %%i
set "Vorname=%Name%"

echo %vorname%
echo %nachname%


goto :eof
:ProcessLine
if not defined Zeile goto :Error
set /a Z=-1
:Loop
set /a Z+=1
call set Zeichen=%%Zeile:~%Z%,1%%
if not defined Zeichen goto :Error
echo %Ziffern%|findstr "%Zeichen%">nul && goto :Loop

call set "Name=%%Zeile:~%Z%%%"
"%Aus%" echo %Name%
goto :eof

:Error
echo In Zeile %1: "%Zeile%" konnte kein Name gefunden werden!
pause
goto :eof
[/code]
Mitglied: 60730
60730 Jan 12, 2009 at 15:37:46 (UTC)
Goto Top
Servus,

meine Verwirrend bezeichneten Böcke wurden als Biber erkannt und verschwinden daher, damit es nicht undurchschaubar wird face-wink
Merci an Bastla und seine wachen Augen face-wink

PS: Code bitte in <> nicht in Klammern face-wink

Gruß
Member: bastla
bastla Jan 12, 2009 at 15:49:39 (UTC)
Goto Top
@timobeil
Die von Dir bemängelten "Böcke" sind eigentlich "Biber" face-wink und sollten daher nicht verändert werden (bitte gelegentlich testen) ...

@Maffi
Sorry - Dein eben geposteter Code und Deine am 06.01.2009 um 18:28:05 Uhr dargestellten Inhaltsbeispiele erzeugen bei mir die gewünschten Ausgaben, was den Verdacht nahelegt, dass Deine Ausgangsdatei die Ursache des Problems sein könnte (ev Unicode?) ...

Grüße
bastla
Member: Maffi
Maffi Jan 12, 2009 at 16:07:46 (UTC)
Goto Top
Ok, hab den Fehler gefunden, falsche Pfadangabe, mein fehler face-smile Pat.bdt wurde nicht gefunden^^ bis hier hin erstmal danke,

noch ein kleines Problem, wenn ich jetzt

echo "%Nachname%_%Vorname%"

dann bekomm ich ausgegeben
Testmann _Otto ich brauche aber
Testmann_Otto

also da ist ein leerzeichen, kann ich das irgendwie umgehen?

grüße
Manuel
Mitglied: 60730
60730 Jan 12, 2009 at 16:10:13 (UTC)
Goto Top
Servus Manuel,

auch auf die Gefahr das ich wieder daneben liegen sollte face-wink

set "Nachname=%Name%
ändern in:
set "Nachname=%Name%"
Gruß
Member: bastla
bastla Jan 12, 2009 at 16:17:02 (UTC)
Goto Top
@timobeil
Nix gegen Deine Augen - hast völlig Recht face-smile (dabei hatte ich das doch oben schon nachgetragen) ...

Leider wird beim Kopieren aus einem Code-Block auch immer noch ein Leerzeichen am Ende jeder Zeile angefügt - beides zusammen führt dann zum beschriebenen unerwünschten Ergebnis.

Grüße
bastla
Member: Maffi
Maffi Jan 12, 2009 at 18:28:46 (UTC)
Goto Top
Ja danke super, läuft alles Prima, jetzt brauch ich nur noch eine kleine änderung, hat sich spontan ergeben, ich bräuchte noch das geburtsdatum in einer Variable face-smile

lg Manuel
Member: bastla
bastla Jan 12, 2009 at 19:04:39 (UTC)
Goto Top
Hallo Maffi!

Dann würde ich spontan zu
for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "10:"') do set "Zeile=%%b"  
set "Gebdat=%Zeile:~-8%  
als neue Zeilen 12 und 13 raten ...

Grüße
bastla
Member: Maffi
Maffi Jan 12, 2009 at 20:43:50 (UTC)
Goto Top
jap klappt super, war auch nicht anders zu erwarten, ist es denn noch möglich das mit punkten zu versehen?

im mom sieht das so aus
21091945
super wäre natürlich 21.09.1945

Grüße Manuel
Member: bastla
bastla Jan 12, 2009 at 20:51:07 (UTC)
Goto Top
Mit einer zusätzlichen Zeile etwa so:
set "Gebdat=%Gebdat:~,2%.%Gebdat:~2,2%.%Gebdat:~4%"
Grüße
bastla
Member: Maffi
Maffi Jan 12, 2009 at 21:02:49 (UTC)
Goto Top
Klappt super dankeschön für alles