silence
Goto Top

Eine TXT-Datei auslesen und gesuchten Inhalt mit Treffer in eine andere Textdatei schreiben

Hallo zusammen

Ich habe mehrere Textdateien, die unterschiedlich aufgebaut sind, teilweise weisen sie ein Muster auf wie ein csv, oder aber auch ursprünglich aus einem XML voller Code.

In allen Textfiles kommen aber immer Textteile vor, die mit AZQ_ beginnen und max 10 Digits haben. Ich möchte über ein Powershell alle diese Einträge wenn möglich ohne Duplikate in ein anderes Textfile schreiben, da ich die Daten weiter verarbeiten möchte.

Beispiel

Abgaskrümmer</Value>
</Values>
</ID>
<ID="AZQ_125875" >
<Name>258555600 - VW Golf</Name>


In neues Textfile
AZQ_125875
usw.

Wie krieg ich das am besten hin?

Besten Dank für Eure Hilfe

Content-ID: 73849983741

Url: https://administrator.de/forum/eine-txt-datei-auslesen-und-gesuchten-inhalt-mit-treffer-in-eine-andere-textdatei-schreiben-73849983741.html

Ausgedruckt am: 16.02.2025 um 18:02 Uhr

godlie
godlie 14.09.2023 um 13:28:22 Uhr
Goto Top
Hallo,

eigentlich recht einfach, durch die Dateien loopen und dann pro datei suchen
$currentDirectory = Get-Location
$files = Get-ChildItem -Path $currentDirectory -Filter *.txt
foreach ($file in $files) {
    $content = Get-Content -Path $file
    $matches = Select-String -Path $file -Pattern "<ID="(.*)">  
    $id = $matches.Matches[0].Groups[1]
    Write-Host "Die ID in $file ist $id"  
}

grüße supported by GoogleBard ;)
7907292512
Lösung 7907292512 14.09.2023 aktualisiert um 14:14:00 Uhr
Goto Top
In allen Textfiles kommen aber immer Textteile vor, die mit AZQ_ beginnen und max 10 Digits haben. Ich möchte über ein Powershell alle diese Einträge wenn möglich ohne Duplikate in ein anderes Textfile schreiben, da ich die Daten weiter verarbeiten möchte.
Biddeschön
(Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches).Matches.Value | select -Unique | set-content .\ergebnis.txt  

Gruß sid
TK1987
Lösung TK1987 14.09.2023 um 14:07:55 Uhr
Goto Top
Moin,

ich würde da einfach mit Select-String arbeiten...
(Select-String "AZQ_(\d{1,10})" -Path "D:\Test\*.txt").Matches.Value  

Gruß Thomas
Silence
Silence 14.09.2023 um 15:26:26 Uhr
Goto Top
Zitat von @7907292512:

In allen Textfiles kommen aber immer Textteile vor, die mit AZQ_ beginnen und max 10 Digits haben. Ich möchte über ein Powershell alle diese Einträge wenn möglich ohne Duplikate in ein anderes Textfile schreiben, da ich die Daten weiter verarbeiten möchte.
Biddeschön
(Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches).Matches.Value | select -Unique | set-content .\ergebnis.txt  

Gruß sid

Hi Sid, das ist die Lösung, herzlichen Dank! Funktioniert und dann auch noch ruck zuck!
Silence
Silence 14.09.2023 um 15:27:57 Uhr
Goto Top
Zitat von @TK1987:

Moin,

ich würde da einfach mit Select-String arbeiten...
(Select-String "AZQ_(\d{1,10})" -Path "D:\Test\*.txt").Matches.Value  

Gruß Thomas

Hi Thomas

Und auch das funktioniert, einfach ohne Ausgabe in ein File. Aber auch perfekt!!!
Silence
Silence 14.09.2023 um 15:28:20 Uhr
Goto Top
Danke Euch allen für die schnelle und profesionelle Hilfe
LG
Silence
Silence
Silence 15.09.2023 um 10:00:58 Uhr
Goto Top
Das Ding macht wirklich Freude, liest mehrere Files aus die zum Teil bis zu 1 GB gross sind. Eine Frage hätte ich noch.
Nun wird in ein File z.B. folgender Inhalt gelistet:

AZQ_123
AZQ_456
AZQ_897

Die Datei hat einen speziellen Namen, z.B. Auflistung_aus_File_1.txt

Ich möchte später die Dateien zusammenführen, so dass ich sehe, welche Einträge aus welchen Files stammen. Bestimmte Einträge können auch aus mehreren Files stammen.

Ich würde gerne im File vorangestellt pro Zeile einen text schreiben:

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897

Ich bin Neuling und weiss nicht wie ich das zustandebringe mit dem Code

(Select-String "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches).Matches.Value | select -Unique | set-content .\ergebnis.txt

Was genau müsste ich wo einsetzen?

Danke vielmals
7907292512
7907292512 15.09.2023 aktualisiert um 10:13:43 Uhr
Goto Top
Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches | %{$_.Path + " : " + (($_.Matches.Value | select -Unique) -join ',')} | set-content .\ergebnis.txt  
Silence
Silence 15.09.2023 um 10:35:32 Uhr
Goto Top
Zitat von @7907292512:

Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches | %{$_.Path + " : " + (($_.Matches.Value | select -Unique) -join ',')} | set-content .\ergebnis.txt  

Hmm, Text kommt rein als Pfad, aber leider werden nun bestimmte Einträge nicht mehr untereinander, sondern teilweise mit Komma getrennt hintereinander gezeigt.

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456, AZQ_897
Herkunft File 1 AZQ_897

Ich möchte wie vorher alles untereinander, nur einen Eintrag und mit vorangestelltem Text.
TK1987
TK1987 15.09.2023 aktualisiert um 10:38:25 Uhr
Goto Top
Moin,

Zitat von @Silence:
Ich würde gerne im File vorangestellt pro Zeile einen text schreiben:

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897
macht es dann nicht mehr Sinn, das Ganze direkt als Tabelle auszugeben?

Bestimmte Einträge können auch aus mehreren Files stammen.
Hier könnte man die Herkunft dann auch gleich gruppieren, sodass jede Nummer eindeutig ist...
Select-String "AZQ_\d{1,10}" *.txt | group {$_.Matches.Value} | %{[PsCustomObject][Ordered]@{Herkunft=$_.Group.Filename -Join ', ' ; Nummer = $_.Name}} | Export-CSV -Path "Ausgabe.csv" -Delimiter ';' -NoTypeInfo -Encoding UTF8  

Gruß Thomas
Silence
Silence 15.09.2023 um 10:43:24 Uhr
Goto Top
Zitat von @TK1987:

Moin,

Zitat von @Silence:
Ich würde gerne im File vorangestellt pro Zeile einen text schreiben:

Herkunft File 1 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897
macht es dann nicht mehr Sinn, das Ganze direkt als Tabelle auszugeben?

Bestimmte Einträge können auch aus mehreren Files stammen.
Hier könnte man die Herkunft dann auch gleich gruppieren, sodass jede Nummer eindeutig ist...
Select-String "AZQ_\d{1,10}" *.txt | group {$_.Matches.Value} | %{[PsCustomObject][Ordered]@{Herkunft=$_.Group.Filename -Join ', ' ; Nummer = $_.Name}} | Export-CSV -Path "Ausgabe.csv" -Delimiter ';' -NoTypeInfo -Encoding UTF8  

Gruß Thomas

Genial, das ist es!!! Danke vielmals Thomas
Silence
Silence 15.09.2023 um 12:15:02 Uhr
Goto Top
Jetzt hab ich ein neues Phänomen mit einer Datei die ursprünglich mal ein XML war. Nun kommt das ganze so daher:

Herkunft File 1, Herkunft File 2 AZQ_123
Herkunft File 1 AZQ_456
Herkunft File 1 AZQ_897
7907292512
Lösung 7907292512 15.09.2023 um 12:26:04 Uhr
Goto Top
$result = foreach($file in Select-String  "D:\path\*.txt" -Pattern "AZQ_\d{1,10}" -AllMatches){  
    foreach($match in $file.matches.value | select -Unique){
        [pscustomobject][ordered]@{
            File = $file.Path
            Number = $match
        }
    }
}
$result | export-csv .\ergebnis.csv -Delimiter ";" -NoTypeInformation -Encoding UTF8  
Silence
Silence 19.09.2023 um 10:31:27 Uhr
Goto Top
Hi Experten, ich hätte noch eine Frage. Wenn in ganz seltenen Fällen Textteile auftreten, die nach dem "_" nicht nur Digits, sondern auch einen Buchstaben enthalten, wie müsste ich diesen Code anpassen/erweitern? Ich kriegs einfach nicht hin.

Als wenn z.B. solche Fälle auftreten:

AZQ_123456 (funktioniert jetzt, wird mit untigem Code sauber gefunden)
AZQ_BSDCW (gibts in selten Fällen und kann ich nicht finden mit aktuellem Code)

#Alle Ergebnisfiles mit AZQ_digits werden zusammengeführt und der Filename wird vorangestellt
$result = foreach($file in Select-String  $ResultDrive\*.txt -Pattern "AZQ_\d{1,10}" -AllMatches){    
    foreach($match in $file.matches.value | select -Unique){
        [pscustomobject][ordered]@{
            Exportdatei = $file.filename
            Attribut = $match

Herzlichen Dank für Eure Hilfe
7907292512
Lösung 7907292512 19.09.2023 aktualisiert um 10:52:13 Uhr
Goto Top
Den Regex im Pattern anpassen ...
-Pattern "AZQ_[a-z\d]{1,10}"  
Silence
Silence 19.09.2023 um 12:51:09 Uhr
Goto Top
Danke Dir vielmals Siddius 👍