56921
Goto Top

Emailadressen aus String parsen (per Batch)

Hallo,

ich bin gerade etwas ratlos, wie ich aus einem String eine Emailadresse herausparsen kann. Schwierigkeit ist dabei, dass die Strings nicht in einem eindeutigem Format vorliegen, sondern z.B. so:
  1. From: "Horst Schlemmer" <horst@schlemmer.de>
  2. From: Horst Schlemmer aus Grevenbroich <horst@schlemmer.de>
  3. From: <horst@schlemmer.de>
  4. From: "horst@schlemmer.de"
  5. From: horst@schlemmer.de
usw.

Bisher habe ich das hier probiert, was mir zumindest schon mal den Domainpart liefert:
FOR /F "tokens=1,2* delims=@" %%I IN ('FINDSTR /R ^From: %FULLPATH%\%FILENAME%') DO CALL :set_var_once "%%I" "%%J"

Mein Problem ist der Hostpart, da ich ja gerade bei Leerzeichen nicht weiß, wieviele Tokens dazu vorhanden sind.

Ich wäre für eine Lösung (oder eine Idee für eine Lösung face-wink) sehr dankbar!

Gruß,
Carsten

Content-Key: 147665

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

Printed on: April 25, 2024 at 13:04 o'clock

Member: Friemler
Friemler Jul 26, 2010 at 13:39:21 (UTC)
Goto Top
Hallo carsten-h,

hier ein Vorschlag zur Lösung Deines Problems:

@echo off

setlocal enabledelayedexpansion


FOR /F "tokens=1,2* delims=@" %%I IN ('FINDSTR /R ^From: %FULLPATH%\%FILENAME%') DO (  
  set "p1=%%I"  
  set "p2=%%J"  
  
  set p1=!p1:"=!  
  set p2=!p2:"=!  
  
  set "p1=!p1:<=!"  
  set "p2=!p2:>=!"  

  set "p1=!p1:&=!"  
  set "p2=!p2:&=!"  

  call :getadr "!p1!" "!p2!"  
  
  echo !address!
)

exit /b

endlocal



:getadr
setlocal

set "hst=%~1"  
set "dom=%~2"  
  
:loop1
  set chr=%hst:~-1%
  if "%chr%" neq " " set host=%chr%%host%  
  set hst=%hst:~0,-1%
if "%chr%" neq " " goto loop1  


:loop2
  set chr=%dom:~0,1%
  if "%chr%" neq " " set domain=%domain%%chr%  
  set dom=%dom:~1%
if "%dom%" neq "" if "%chr%" neq " " goto loop2  


endlocal & set address=%host%@%domain%
exit /b


Die Zeichen <, >, " und & werden aus dem String herausgefiltert (< nur beim ersten Teil, der den Host enthält, > nur beim zweiten Teil, der die Domain enthält). Vor der EMail-Adresse muss dann ein Leerzeichen stehen, danach auch ein Leerzeichen oder der String muss direkt zu Ende sein.

[Edit]
Die o.g. Zeichen können zwar Bestandteil einer EMail-Adresse sein, aber hast Du sowas in der Liste?

Gruß
Friemler
Member: TsukiSan
TsukiSan Jul 27, 2010 at 03:19:59 (UTC)
Goto Top
Hallo carsten-h,

also mein erster Vorschlag wäre:
- Kann das Programm, was diese Dateien mit Email-Adressen erzeugt, diese nicht in ein(e) geordnete(s) und immer
wiederkehrende(s) Form/Format bringen?
Das würde im Anschluss einen "Kleinzeiler" erzeugen, der dir die Adressen dann rausfiltert und das ganze mit ganz wenig Mühe.
Also wenn diese Möglichkeit besteht, würde ich hier erst einmal an der "Quelle schrauben".

Gruss
Tsuki
Member: TsukiSan
TsukiSan Jul 27, 2010 at 03:40:18 (UTC)
Goto Top
ansonsten hätte ich auch noch etwas verrücktes in VBS anzubieten:
Dim Filter

MeineDatei = "C:\Email.txt"  
Filter = Array("<",">",Chr(34))  

Set FSO = CreateObject("Scripting.FileSystemObject")  
MeineZeilen = Split(FSO.OpenTextFile(MeineDatei, 1).ReadAll,vbCrLF) 

For i = 0 to Ubound(MeineZeilen)
	temp = split(MeineZeilen(i) , " ")  
	For j = 0 to Ubound(temp)
		temp1 = Split(temp(j), "@")  
		If Ubound(temp1) > 0 then
			MeineEmail = Join(temp1 , "@")  
			For k = 0 to Ubound(Filter)
				MeineEmail = Replace(MeineEmail,Filter(k),"")  
			Next
			Msgbox MeineEmail
			j = Ubound(temp)
		End If
	Next

Next

Gruss
Tsuki
Member: pieh-ejdsch
pieh-ejdsch Jul 27, 2010 at 12:13:56 (UTC)
Goto Top
da in einer Emailadresse keine Leerzeichen vorkommen und es immer der letzte Teil String ohne Leerzeichen ist, könnte es auch kürzer gehen.
gültige Zeichen in einer Mailadresse sind
A-Za-z0-9.!#$%&'*+-/=?^_`{|}~

hier sind aber Eventuelle Leerzeichen hinter dem letzten String berücksichtigt.
@echo off & setlocal
set fullpath=D:\Adminhelp
set filename=Testdokument.txt
FOR /f "tokens=1*" %%i IN ('FINDSTR /b /c:"From:" "%FULLPATH%\%FILENAME%"') do (  
	set "Mail=%%j"  
	setlocal enabledelayedexpansion
	set "Mail=!Mail:"=!"  
	set "Mail=!Mail:<=!"  
	set "Mail=!Mail:>=!"  
	echo "!Mail!"|findstr /v "* ?">nul&&(for %%k in ("!Mail: =" "!") do echo "%%~k"|find "@">nul&&set "Mail=%%~k")||call :Mail  
	echo "!Mail!"|find "@">nul&&echo !Mail!  
	endlocal
)
pause>nul&goto :eof
:Mail
if not "!Mail:* =!" == "!Mail!" echo "!Mail:* =!"|find "@">nul&&(set "Mail=!Mail:* =!"&goto :Mail)  
die Sprungmarke :Mail ist nur eingefügt, da die Platzhalter in der Forschleife in Zeile 10 eine Datei suchen würden.

@Friemler
das & brauchst Du doch nicht herausfiltern...

Gruß Phil
Member: Friemler
Friemler Jul 28, 2010 at 11:21:31 (UTC)
Goto Top
Hallo pieh-ejdsch,

Zeile 10 ist ja eine echte Breitseite, verliere doch noch mal ein paar Worte darüber, was Du Dir dabei gedacht hast/wie es funktioniert.

Gruß
Friemler
Member: pieh-ejdsch
pieh-ejdsch Jul 28, 2010 at 14:15:56 (UTC)
Goto Top
Moin Friemler,

ja das ist wirklich ein klein wenig äähm Erklärungsbedürftig...

echo "!Mail!"|findstr /v "* ?">nul
FINDSTR gibt eine Erfolgsmeldung wenn KEINE * oder ? in der Variable Zeile gefunden werden - ansonsten keine Erfolgsmeldung (%ERRORLEVEL%>0)


da die Schleife
for %k in ("abc*") do echo %k...
for %k in ("abc?") do echo %k...
das aktuelle Verzeichnis nach Namen abc.... bzw abc. durchsucht fasst es leider in die Grütze, wenn in der Variable die Platzhalterzeichen ? * (Fragezeichen, Sternchen) enhalten sind.
es kann ja sein in der Variable ist es doch drin - wenn ja wird der String halt in der Subroutine bearbeitet halt nur langsamer.
for %%k in ("!Variable: =" "!") do ....
die Variable anstelle der Leerzeichen mit einem Anführungszeichen davor und danach anzeigen, damit ich in der Laufvariable %%k zum Beispiel "Herr&Mann" stehen habe oder "Susi(Susann)" diese Ausfilterung in der Forschleife geht doch zig mal schneller
for %i in (a b c d) do echo %i...
geht ja noch wie gewollt - aber
for %i in (a(abc) b c) do echo %i...
geht net mehr - daher so
for %i in ("a(abc)" "b" "c") do echo %i

Gruß Phil
Member: Friemler
Friemler Jul 28, 2010 at 23:50:24 (UTC)
Goto Top
Hallo pieh-ejdsch,

danke für die Erklärung. Ich habe Deinen Code ausführlich getestet und kann sagen, daß er in allen Fällen fehlerfrei gelaufen ist. Gute Arbeit.


back-to-topACHTUNG! Ich poste den Code von pieh-ejdsch hier nochmal in einer besser lesbaren Form, der Algorithmus ist aber NICHT von mir!


@echo off

setlocal enabledelayedexpansion

set "fullpath=%cd%"  
set "filename=emails.txt"  

for /f "tokens=1*" %%i IN ('findstr /b /c:"From:" "%fullpath%\%filename%"') do (  
  set "Mail=%%j"  

  set "Mail=!Mail:"=!"  
  set "Mail=!Mail:<=!"  
  set "Mail=!Mail:>=!"  

  rem Enthält die Zeile Wildcards?
  echo "!Mail!"|findstr /v "* ?" > NUL  

  if !errorlevel! equ 0 ( rem Keine Wildcards
    for %%k in ("!Mail: =" "!") do (  
      echo "%%~k"|find "@" > NUL  
      if !errorlevel! equ 0 set "Mail=%%~k"  
    )
  ) else ( rem Mit Wildcards
    call :ParseLineWithWildcards
  )

  echo "!Mail!"|find "@" > NUL  
  if !errorlevel! equ 0 echo !Mail!
)

endlocal

echo.
pause
exit /b


:ParseLineWithWildcards
if not "!Mail:* =!" equ "!Mail!" (  
  echo "!Mail:* =!"|find "@" > NUL  

  if !errorlevel! equ 0 (
    set "Mail=!Mail:* =!"  
    goto :ParseLineWithWildcards
  )
)

Gruß
Friemler
Mitglied: 56921
56921 Jul 30, 2010 at 08:28:52 (UTC)
Goto Top
Zitat von @Friemler:
Hallo pieh-ejdsch,

danke für die Erklärung.

Dem kann ich mich nur anschließen! Funktioniert super! Respekt!

Danke & Gruß,
Carsten
Hotly discussed
gleixnerdCheck of ZFW Firewallgleixnerd - 5 CommentsjstrickerWireguard VPN on UDM Pro behind Fritzbox - Handshake did not completejstricker - 3 Comments