Suchen und Verarbeiten von Keywords in Textdateien

solareclipse

Cadet 2nd Year
Registriert
Nov. 2015
Beiträge
19
Hallo liebes Forum,

ich habe eine kleine Aufgabe vor mir und brauche mal kurz ganz allgemein eure Hilfe:
Ich habe einige Textdateien in denen sich keywords befinden, die innerhalb des Textes auf eine externe Datei verweisen.
Ich benötige ein Programm, das mir mehrere Textdateien nach jenen Keywords durchsucht und bei Treffern die korrespondierenden Dateinamen ausgibt.

Ein Beispiel:
Das Kennfeld der Pumpe hat die ID "15" und den Namen "Meier100V920W.xml" und wird in einer beliebigen Textdatei an einer beliebigen Stelle aufgerufen.
Das Kennfeld der Kühlung hat die ID "20" und den Namen "Bauer2KW.xml" und wird in einer beliebigen Textdatei an einer beliebigen Stelle aufgerufen.

Ausgabe der Treffer in einer Textdatei:
"Textdatei#1"
Kennfeld Pumpe ---- Meier100V920W.xml
Kennfeld Kühlung ---- Bauer2KW.xml
"Textdatei#2"
Kennfeld Pumpe ---- Holzer12V40W.xml
Kennfeld Kühlung ---- Bauer100W.xml
usw.

Es gibt etwa 20 ID´s (also sehr viel mehr Kennfelder). Die zu durchsuchenden Textdateien werden in der Konsole oder in einer Textdatei aufgelistet und müssen dann von dem benötigten Programm Zeile für Zeile ausgelesen werden.

Meine Frage: Mit welcher Sprache ließe sich dies am einfachsten und am schnellsten realisieren ohne ein Programm auf dem PC installieren zu müssen? Für Sprachen wie C++ oder Python oder ähnl. bräuchte ich eine Online Umgebung zur Entwicklung und Kompilierung. Ausführen auf dem PC kann ich nur eigentlich nur Windows-eigene Formate wie Batch-Skripte oder VBScripte, Power Shell oder eben eine .exe.

Vielen Dank für eure Hilfe!

Grüße, solareclipse

Zusatz: Bisher habe ich ein bischen Erfahrung mit C, VBScript und Batchprogrammierung gesammelt. Codes können auch in Notepad++ geschrieben werden.
 
z.b. mit java und aus deinem source eine .JAR generieren...

die kann jeder pc öffen, solang er JAVA installiert hat...
 
Das lässt sich relativ einfach mit einer Batch-Datei lösen. Zwei Schleifen, die äußere über die zu durchsuchenden Dateien, die innere über die Suchbegriffe. Mit findstr kannst Du die Dateien durchsuchen. Wenn der Suchbegriff gefunden wurde, gibt findstr Zeilennummer und Position zurück. Mittels skiplines kannst Du direkt die betreffende Zeile auslesen und die gewünschten Informationen ausgeben.
 
Mit PowerShell relativ gut machbar (sofern man die Skriptsprache auch beherrscht).
Einfach Datei für Datei, Zeile für Zeile durchgehen und mit Regular Expressions die IDs und die Namen finden.
Das ganze ständig in ein Array packen und am Ende in eine Textdatei in dem gewünschten Format ausgeben.
 
Zuletzt bearbeitet:
@Andreas_:
Ich nehme an du meinst zwei FOR Schleifen?
Dann versuche ich mich daran mal...

Vielen Dank für die Tipps:)

EDIT:
Also mit dem folgenden Befehl hole ich mir schonmal die Zeile in der die ID und der Name stehen:
Code:
FOR /F "tokens=*" %%a in ('FINDSTR "t_id=\"551\"" %ptd%') DO (echo %%a)

Ausgabe:
<object id="o60084" name="ExplicitControl" t_id="551">

Leider hat diese Ausgabe nicht immer die gleiche Anzahl an "Tokens" oder auch Wörter, weshalb das Wort 'name="xyz"' nicht wie hier beispielsweise über "token=3" ausgelesen werden kann. Das ist das woran ich gerade hänge...Gibt es eine Möglichkeit das Wort mit einem beliebigen "xyz" auszulesen? Wenn dabei gleich nur "xyz" ausgelesen werden kann wäre es natürlich noch besser!
 
Zuletzt bearbeitet:
Kannst Du mal zwei konkrete kleine Beispiele für solche input-Dateien und eine Datei mit der gewünschten Ausgabe posten?
 
solareclipse schrieb:
Leider hat diese Ausgabe nicht immer die gleiche Anzahl an "Tokens" oder auch Wörter, weshalb das Wort 'name="xyz"' nicht wie hier beispielsweise über "token=3" ausgelesen werden kann. Das ist das woran ich gerade hänge...Gibt es eine Möglichkeit das Wort mit einem beliebigen "xyz" auszulesen? Wenn dabei gleich nur "xyz" ausgelesen werden kann wäre es natürlich noch besser!
Gibt es ein eindeutiges Trennzeichen zwischen den Token? Wenn die Bezeichner kein Leerzeichen enthalten könnte man dieses nehmen, ansonsten eventuell die Kombination aus Quote und Leerzeichen (ungetestet):
Code:
setlocal EnableDelayedExpansion

FOR /F "tokens=*" %%a in ('FINDSTR "t_id=\"551\"" %ptd%') DO SET line=%%a

:: umschließende < und > entfernen
SET line=!line:~1,-2!
 
:: Leerzeichen durch Linefeed ersetzen, alternativ Quote+Leerzeichen
SET line=!line: =^

!

:: Schleife über die Token der Zeile:
FOR /f "delims=" %%b in ("!line!") DO (
    SET inhalt=%%b
    :: Prüfen ob Token den String name=" enthält
    IF NOT !inhalt!==!inhalt:name\="=! ( 
        SET myName=!inhalt:name\="=!
        :: wenn noch vorhanden abschließendes Quote entfernen, ansonsten weglassen
        set myName=!myName:~0,-1!
    )
)
 
Zuletzt bearbeitet:
Mit PowerShell sollte das so gehen.

Bin natürlich nur nicht sicher, ob ich den Aufbau der Textdateien komplett verstanden habe. Ein Beispiel wäre wirklich sehr hilfreich.
Ich gehe jetzt mal von dieser Aussage aus:
Ein Beispiel:
Das Kennfeld der Pumpe hat die ID "15" und den Namen "Meier100V920W.xml" und wird in einer beliebigen Textdatei an einer beliebigen Stelle aufgerufen.
Das Kennfeld der Kühlung hat die ID "20" und den Namen "Bauer2KW.xml" und wird in einer beliebigen Textdatei an einer beliebigen Stelle aufgerufen.

#Filenames.txt (Dateinamen aus einer Datei, die durchsucht werden sollen)
Code:
C:\temp\test\Filenames.txt
C:\temp\test\New Text Document - Copy (2).txt
C:\temp\test\New Text Document - Copy.txt
C:\temp\test\New Text Document.txt

#New Text Document - Copy (2).txt (eine der oben genannten Dateien)
Code:
blablabla
bla blabla blaaaaa
bla blabla blaaaaa 15 15151515.xml 15 dfsdfs.xml 15 fgcvdd.xml 
bla
blablabla
bla blabla blaaaaabla blabla blaaaaa
bla blabla blaaaaa 20 20202020.xml 15 3423434.xml
blaaaaa

#Script.ps1
Code:
Clear-Host 

$FileNamesFilePath = 'C:\temp\test\Filenames.txt' 
$OutputFilePath = 'C:\temp\test\Result.txt' 
$Encoding = [Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding]::UTF8 

$Kennfelder = @{ # IDs in Form von Zahlen unbedingt als STRING (mit Hochkomma) angeben 
	'15' = 'Pumpe' 
	'20' = 'Kühlung' 
} 

# Create RegExpression for 'Kennfelder'  
$RegExpKennfelder = ($Kennfelder.Keys | % { "\W$_\W" }) -join '|' # Erstellt das Regular Expression Pattern aus den IDs mit Leerzeichen vor und nach den IDs       
# Create RegExpression for 'Name'  
$RegExpName = '\w*.xml' 


# Get Filenames from $FileNamesFilePath  
$FileNames = Get-Content $FileNamesFilePath -Encoding $Encoding 
$Files = get-item $FileNames 

$Results = @() 
Foreach ($File In $Files) { 
	$Content = get-content $File.FullName -Encoding $Encoding 
	
	$LineNumber = 0 
	Foreach ($line In $content) { 
		$LineNumber++ 
		$IDs = @([regex]::matches($line , $RegExpKennfelder).Value) 
		$Names = @([regex]::matches($line , $RegExpName).Value) 
		
		If ($IDs -ne $Null) { 
			For ($i = 0 ; $i -lt @($IDs).count ; $i++) { 
				[string] $KennfeldID = ([regex]::matches(@($IDs)[$i] , '\W(.*)\W'))[0].Groups[1].Value 
				$Results+= New-Object psobject -Property([ordered] @{ 'Datei' = $File.Name ; 'Zeile' = $LineNumber ; 'Kennfeld ID' = $KennfeldID ; 'Kennfeld' = $Kennfelder[$KennfeldID] ; 'Name' = $Names[$i] }) 
			} 
		} 
	} 
} 

Write-host 'Ergebnis:' -ForegroundColor Red 
$Results | ft 
$GroupedResult = $Results | Group-Object 'Datei' 

$Text = @() 
Foreach ($Group In $GroupedResult) { 
	$Text+= "`"$($Group.Name)`"" 
	Foreach ($Result In $Group.Group) { 
		$Text+= "Kennfeld $($Result.Kennfeld) ---- $($Result.Name)" 
	} 
} 

$Text | Out-File $OutputFilePath -Encoding $Encoding -Force 
Start-Process $OutputFilePath

Ergebnis in der Konsole
Code:
Ergebnis:

Datei                            Zeile Kennfeld ID Kennfeld Name        
-----                            ----- ----------- -------- ----        
New Text Document - Copy (2).txt     3 15          Pumpe    15151515.xml
New Text Document - Copy (2).txt     3 15          Pumpe    dfsdfs.xml  
New Text Document - Copy (2).txt     3 15          Pumpe    fgcvdd.xml  
New Text Document - Copy (2).txt     7 20          Kühlung  20202020.xml
New Text Document - Copy (2).txt     7 15          Pumpe    3423434.xml 
New Text Document - Copy.txt         4 20          Kühlung  hahah.xml   
New Text Document - Copy.txt         4 15          Pumpe    hfksdf.xml  
New Text Document.txt                4 15          Pumpe    test.xml

#Result.txt (Ausgabedatei)
Code:
"New Text Document - Copy (2).txt"
Kennfeld Pumpe ---- 15151515.xml
Kennfeld Pumpe ---- dfsdfs.xml
Kennfeld Pumpe ---- fgcvdd.xml
Kennfeld Kühlung ---- 20202020.xml
Kennfeld Pumpe ---- 3423434.xml
"New Text Document - Copy.txt"
Kennfeld Kühlung ---- hahah.xml
Kennfeld Pumpe ---- hfksdf.xml
"New Text Document.txt"
Kennfeld Pumpe ---- test.xml
 
Zuletzt bearbeitet:
Zurück
Oben