privex007
Goto Top

VBS Script um Emailadressen aus einer TXT, CSV oder XLS-Datei zu lesen

Hallo zusammen,

ich benötige eine Möglichkeit meine Dateien (txt, csv und xls) zu durchforsten und meine Mailadressen in eine separate TXT-Datei abzulegen.
Ich weiß das man das mit einem VBS-Script wunderbar hinbekommt aber ich habe null Ahnung vom Coden.

Perfekt wäre natürlich wenn man einen ganzen Ordner durchsuchen kann.

Vielen Dank für eure Hilfe!

Gruß

Privex007

Content-Key: 252963

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

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

Member: rubberman
rubberman Oct 24, 2014 at 14:01:23 (UTC)
Goto Top
Hallo Privex007, willkommen im Forum.

ich benötige eine Möglichkeit meine Dateien (txt, csv und xls) zu durchforsten und meine Mailadressen in eine separate TXT-Datei abzulegen.
Joa, wir schreiben auch mal ein paar Zeilen fertigen Code. Voraussetzung ist aber, dass du zumindest konkret wirst, wie die Daten vorliegen und wie sie Ausgegeben werden sollen. Außerdem: Benötigst du nur die gefundenen Adressen oder sind diese irgendwie mit Zusatzdaten verlinkt, die du auch brauchst?
Mit 2 hingeschmissenen Sätzen ohne Beschreibung und Beispielen wird das vermutlich nichts.

Grüße
rubberman
Member: Privex007
Privex007 Oct 24, 2014 at 14:13:57 (UTC)
Goto Top
Da hast du Recht. Ein bisschen mehr hätte ich euch erzählen können.

Also hauptsächlich habe ich "txt"-Dateien die gefüllt sind mit einigem an Text (Briefe etc.). Daraus möchte ich nur die reine Emailadresse filtern "xxxx@xxx.xx". Manchmal habe ich auch "csv"- und "xls"-Dateien wo die Emailadressen in verschiedenen Spalten vorkommen.
Es sind keine Zusatzdaten verlinkt.

Ich habe einen Code-Schnipsel der mir ein bisschen was macht aber nicht vollständig:


Option Explicit

Dim objArgs, fso, strFile, strTestString
Dim strPattern, strAllMatches

Set objArgs = WScript.Arguments

ErrCheck objArgs.Count < 1, 1, "No argument specified."

strFile = objArgs(0)

Set fso = CreateObject("Scripting.FileSystemObject")
ErrCheck Not fso.FileExists(strFile), 1, "File supplied as argument cannot be found: '" & strFile & "'"

'# WScript.Echo "Checking file contents for email addresses: '" & strFile & "'" & vbCrlf

strPattern = "([\w-\.]+)@\w{2,}(\.\w{2,}){1,5}"

strTestString = fso.OpenTextFile(strFile, 1).ReadAll

strAllMatches = fGetMatches(strPattern, strTestString)

If strAllMatches <> "" Then
WScript.Echo strAllMatches
Else
WScript.Echo "-- None Found --"
End If

'# WScript.Echo vbCrlf & "End of " & WScript.ScriptName

Function fGetMatches(sPattern, sStr)
Dim regEx, retVal, sMatch, colMatches, temp
Set regEx = New RegExp ' Create a regular expression.
regEx.Pattern = sPattern ' Set pattern.
regEx.IgnoreCase = True ' Set case insensitivity.
regEx.Global = True ' Set global applicability.

Set colMatches = regEx.Execute(sStr) ' Execute search.

If colMatches.Count = 0 Then
temp = ""
Else
For Each sMatch In colMatches
temp = temp & sMatch & "¶"
Next
temp = Left(temp, Len(temp) - 1)
temp = Replace(temp, "¶", vbCrlf)
End If
fGetMatches = temp
End Function

Sub ErrCheck(blTest, iErrNum, sTxt)
Dim sErrText
If Not blTest Then Exit Sub
sErrText = "Error: " & sTxt
MsgBox sErrText, vbSystemModal + vbCritical, "Error in: " & WScript.ScriptName
WScript.Quit iErrNum
End Sub


Wenn ich meine "txt"-Datei auf die ausführbare "vb"-Datei per Drag and Drop ziehe, dann meldet er mir eine MessageBox mit leider nur einer einzigen Emailadresse. Ich bräuchte die Ausgabe in einer separaten "txt"-Datei und natürlich mit allen enthaltenen Adressen.

Habt ihr da Hilfe für mich?

Vielen Dank schonmal im Voraus!

Gruß

Privex007
Mitglied: 114757
114757 Oct 24, 2014 updated at 14:52:31 (UTC)
Goto Top
Hallo,
mit Powershell geht dies auch komfortabel und kurz, ohne jetzt mal xls Dateien zu beachten
(diese müsste man via Code öffnen und dann dann auswerten, geht aber auch mit etwas mehr Aufwand ...)
ginge es ungefähr so für alle txt und csv-Dateien in allen Unterordnern eines Ordners:
$allMails = 'd:\all_mails.txt'  
gci "D:\Ordner\*" -Include "*.csv","*.txt" -recurse | %{([regex]'(?i)[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,6}').matches((gc $_.Fullname)) | select -Expand Value | out-file $allMails -Append}  
Gruß
jodel32
Member: rubberman
Solution rubberman Oct 24, 2014, updated at Oct 26, 2014 at 16:41:27 (UTC)
Goto Top
Hallo Privex007,

lass mal folgendes Script in deinem Verzeichnis laufen:
Option Explicit
Const strOutFile = "emailaddresses.txt"  

Const ForReading = 1, ForWriting = 2
Dim objFSO, objFolder, objInFile, objOutFile, objStream, objRegex, colMatches, _
    objExcelApp, objWorkbook, objWorksheet, objCell, _
    strFolderpath, strFilepath, strExtension, strContent, strMatch

Set objFSO = CreateObject("Scripting.FileSystemObject")  

Set objRegex = New RegExp
objRegex.Pattern = "\b[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\b"  
objRegex.IgnoreCase = True
objRegex.Global = True

Set objFolder = objFSO.GetFolder(objFSO.GetParentFolderName(WScript.ScriptFullName))

Set objOutFile = objFSO.OpenTextFile(strOutfile, ForWriting, True)

Set objExcelApp = CreateObject("Excel.Application")  
objExcelApp.Visible = False


For Each objInFile In objFolder.Files
  If Not StrComp(objInFile.Name, strOutfile, vbTextCompare) = 0 Then
    strFilepath = objInFile.Path
    strExtension = objFSO.GetExtensionName(strFilepath)

    If StrComp(strExtension, "txt", vbTextCompare) = 0 Or StrComp(strExtension, "csv", vbTextCompare) = 0 Then  

      Set objStream = objInFile.OpenAsTextStream(ForReading)
      strContent = objStream.ReadAll
      Set colMatches = objRegex.Execute(strContent)
      If colMatches.Count <> 0 Then
        For Each strMatch In colMatches
          objOutFile.WriteLine strMatch
        Next
      End If
      objStream.Close

    ElseIf StrComp(strExtension, "xls", vbTextCompare) = 0 Then  

      Set objWorkbook = objExcelApp.Workbooks.Open(strFilepath, 0, True)
      For Each objWorksheet In objWorkbook.Worksheets
        For Each objCell In objWorksheet.UsedRange.Cells
          strContent = CStr(objCell)
          If strContent <> "" Then  
            Set colMatches = objRegex.Execute(strContent)
            If colMatches.Count <> 0 Then
              For Each strMatch In colMatches
                objOutFile.WriteLine strMatch
              Next
            End If
          End If
        Next
      Next
      objWorkbook.Close False

    End If

  End If
Next

objExcelApp.Quit
objOutFile.Close


Grüße
rubberman

EDIT Zeile 45 ".Cells" hinzu (ändert nichts am Verhalten des Codes)
Member: Privex007
Privex007 Oct 25, 2014 at 15:53:13 (UTC)
Goto Top
Hallo rubberman,

klappt perfekt. You are the best!

Dankeschön!

Gruß

Privex007