Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Zeilen und Spalten finden per Batch

Frage Entwicklung Batch & Shell

Mitglied: Maffi

Maffi (Level 1) - Jetzt verbinden

06.01.2009, aktualisiert 17:55 Uhr, 4952 Aufrufe, 25 Kommentare

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
Mitglied: 60730
06.01.2009 um 17:50 Uhr
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ß
Bitte warten ..
Mitglied: Maffi
06.01.2009 um 18:18 Uhr
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.
Bitte warten ..
Mitglied: 60730
06.01.2009 um 18:22 Uhr
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
Bitte warten ..
Mitglied: Maffi
06.01.2009 um 18:28 Uhr
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
Bitte warten ..
Mitglied: 60730
06.01.2009 um 18:34 Uhr
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 [_]
Bitte warten ..
Mitglied: Maffi
06.01.2009 um 18:39 Uhr
mhh ist das nicht ein und die selbe frage nur anders formuliert? aber

richtig
richtig
Bitte warten ..
Mitglied: bastla
06.01.2009 um 19:37 Uhr
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:
01.
@echo off & setlocal 
02.
set "Ein=D:\Pat.bdt" 
03.
set "Aus=D:\Pat.txt" 
04.
set "Zeilen=7,8" 
05.
 
06.
set "Ziffern=0123456789" 
07.
if exist "%Aus%" del "%Aus%" 
08.
 
09.
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 
10.
goto :eof 
11.
 
12.
:ProcessLine 
13.
if not defined Zeile goto :Error 
14.
set /a Z=-1 
15.
:Loop 
16.
set /a Z+=1 
17.
call set Zeichen=%%Zeile:~%Z%,1%% 
18.
if not defined Zeichen goto :Error 
19.
echo %Ziffern%|findstr "%Zeichen%">nul && goto :Loop 
20.
 
21.
call set "Name=%%Zeile:~%Z%%%" 
22.
>>"%Aus%" echo %Name% 
23.
goto :eof 
24.
 
25.
:Error 
26.
echo In Zeile %1: "%Zeile%" konnte kein Name gefunden werden! 
27.
pause 
28.
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]
Bitte warten ..
Mitglied: miniversum
07.01.2009 um 14:09 Uhr
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.
Bitte warten ..
Mitglied: bastla
07.01.2009 um 14:13 Uhr
@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 ) - allerdings kann das wirklich nur Maffi genau wissen ...

Grüße
bastla
Bitte warten ..
Mitglied: 60730
07.01.2009 um 15:22 Uhr
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ß
Bitte warten ..
Mitglied: Maffi
07.01.2009 um 16:29 Uhr
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
Bitte warten ..
Mitglied: bastla
07.01.2009 um 16:50 Uhr
Hallo Maffi!

Ersetze das "Hauptprogramm" (die Zeilen 1 bis 10) durch
01.
@echo off & setlocal 
02.
set "Ein=D:\Pat.bdt" 
03.
set "Aus=D:\Pat.txt" 
04.
 
05.
set "Ziffern=0123456789" 
06.
if exist "%Aus%" del "%Aus%" 
07.
 
08.
for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "7:"') do set "Zeile=%%b" & call :ProcessLine %%i 
09.
set "Nachname=%Name%" 
10.
for /f "tokens=1-2 delims=:" %%a in ('findstr /n "^" "%Ein%"^|findstr /b "8:"') do set "Zeile=%%b" & call :ProcessLine %%i 
11.
set "Vorname=%Name%" 
12.
:: Ab hier, was denn sonst noch so anliegt ... 
13.
:: 
14.
:: 
15.
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]
Bitte warten ..
Mitglied: Maffi
12.01.2009 um 10:46 Uhr
Wenn ich die Variablen Vorname und Nachname ausgebe, sagt er mir, sie seien leer???
Bitte warten ..
Mitglied: bastla
12.01.2009 um 13:21 Uhr
Hallo Maffi!

Die (bis vorhin ) 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 Code-Tags).

Grüße
bastla
Bitte warten ..
Mitglied: Maffi
12.01.2009 um 16:33 Uhr
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]
Bitte warten ..
Mitglied: 60730
12.01.2009 um 16:37 Uhr
Servus,

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

PS: Code bitte in <> nicht in [] Klammern

Gruß
Bitte warten ..
Mitglied: bastla
12.01.2009 um 16:49 Uhr
@TimoBeil
Die von Dir bemängelten "Böcke" sind eigentlich "Biber" 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
Bitte warten ..
Mitglied: Maffi
12.01.2009 um 17:07 Uhr
Ok, hab den Fehler gefunden, falsche Pfadangabe, mein fehler 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
Bitte warten ..
Mitglied: 60730
12.01.2009 um 17:10 Uhr
Servus Manuel,

auch auf die Gefahr das ich wieder daneben liegen sollte

set "Nachname=%Name%
ändern in:
set "Nachname=%Name%"
Gruß
Bitte warten ..
Mitglied: bastla
12.01.2009 um 17:17 Uhr
@TimoBeil
Nix gegen Deine Augen - hast völlig Recht (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
Bitte warten ..
Mitglied: Maffi
12.01.2009 um 19:28 Uhr
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

lg Manuel
Bitte warten ..
Mitglied: bastla
12.01.2009 um 20:04 Uhr
Hallo Maffi!

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

Grüße
bastla
Bitte warten ..
Mitglied: Maffi
12.01.2009 um 21:43 Uhr
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
Bitte warten ..
Mitglied: bastla
12.01.2009 um 21:51 Uhr
Mit einer zusätzlichen Zeile etwa so:
set "Gebdat=%Gebdat:~,2%.%Gebdat:~2,2%.%Gebdat:~4%"
Grüße
bastla
Bitte warten ..
Mitglied: Maffi
12.01.2009 um 22:02 Uhr
Klappt super dankeschön für alles
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...