PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Batchdatei oder Ähnliches, um Textdatei auszulesen?


Platos
2023-11-24, 15:19:08
Ich suche nach folgender Möglichkeit:

Ein Ordner (und alle seine Unterordner) soll nach .txt Dateien gescannt werden und jede .txt Datei soll dann (intern*1) geöffnet werden und dann soll ein Fall unterschieden werden (in einem Ordner werden möglicherweise bis zu 2000-3000 .txt Dateien gefunden werden):

- Fall1: Wenn irgendwo in dem Text der .txt Datei Die Zeichenfolge "DDSFormat=" zu finden ist, dann soll überprüft werden, was hinter dem "=" steht. Das soll dann in eine (.txt) Datei geschrieben werden und zwar mit dem Namen und Pfad der Datei. Also Beispiel:

Ein Ordner wird durchsucht: Ordner/unterordner/unterordner/one000_BM.txt

Die .txt Datei "one000_BM.txt" soll nun geöffnet werden (intern) und dann nach "DDSFormat=" gesucht werden. Ist dies vorhanden, soll das, was (in der selben zeile) dahinter steht, in einer Textdatei gespeichert werden mit einem Muster, das so ähnlich aussieht: "DXT5=Ordner/unterordner/unterordner/one000_BM.txt"

Wichtig ist nun, dass für alle gefundenen Treffer keine extra Textdatei erstellt wird, sondern eben alle gefundenen Treffer in der selben Textdatei eine Zeile kriegen pro Treffer.

- Fall 2: Wird in der Textdatei kein "DDSFormat=" gefunden, wird die Datei geschlossen und dann ignoriert.

*1 Mit "Intern" meine ich, das die .txt Datei nicht wirklich aus Usersicht geöffnet wird und sich dann tausende Textdateien öffnen und das System abstürtzt. Falls das nicht geht, müsste man nach jedem "checken" einer Textdatei diese zuerst wieder schliessen, bevor man die nächste "aufmacht".

Hat jemand eine Idee bzw. könnte mir da helfen ?

anorakker
2023-11-24, 15:31:00
Frag z.B. mal ChatGPT: hab dort einfach deine Frage reinkopiert, das kam als Antwort:

Um das gewünschte Verhalten zu implementieren, benötigen Sie wahrscheinlich eine Skriptsprache wie Python. Hier ist ein einfaches Beispiel, das diese Aufgabe lösen könnte:

python

import os

def scan_folder(folder_path):
# Liste für die gefundenen Treffer
hits = []

# Durchsuche den Ordner und seine Unterordner nach .txt-Dateien
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".txt"):
file_path = os.path.join(root, file)

# Öffne die .txt-Datei und suche nach "DDSFormat="
with open(file_path, 'r') as f:
for line in f:
if "DDSFormat=" in line:
# Extrahiere den Wert nach "=" und speichere den Treffer
value = line.split("DDSFormat=")[1].strip()
hits.append(f"DXT5={file_path}")
break # Beende die Suche in dieser Datei, wenn ein Treffer gefunden wurde

# Schreibe die Treffer in eine Ergebnisdatei
with open("ergebnisse.txt", 'w') as result_file:
for hit in hits:
result_file.write(hit + '\n')

# Beispielaufruf für einen Ordnerpfad
scan_folder("Pfad/zum/Ordner")



Dieses Skript durchsucht den angegebenen Ordner und seine Unterordner nach .txt-Dateien. Für jede .txt-Datei wird nach der Zeichenfolge "DDSFormat=" gesucht. Wenn die Zeichenfolge gefunden wird, wird der Wert nach "=" extrahiert und zusammen mit dem Pfad der Datei in die Ergebnisdatei geschrieben.

Beachten Sie, dass dieses Beispiel möglicherweise angepasst werden muss, um genau Ihren Anforderungen zu entsprechen, insbesondere wenn es spezielle Anforderungen an die Verarbeitung der "DDSFormat=" Zeichenfolge gibt.


-> wie gesagt, ich hab nur copy&paste gemacht, obs funktioniert kann ich nicht sagen, aber man kann interaktiv mit chatgpt agieren und kommt mit reiner sprache für so einfach sachen schnell zum ziel....und dazu noch mit kommentiertem und cleanen Code ;)

Platos
2023-11-24, 15:56:20
Danke für den Input.

Wenn ich mir das so ansehe, vor allem die Stelle: hits.append(f"DXT5={file_path}")

...dann sieht das für mich so aus, als würde dann immer DXT5 stehen, anstatt wirklich auszulesen, was da hinter dem "=" steht.

Oder verstehe ich das falsch?

Edit: Wenn ich das Beispiel mit DXT5 weg lasse in der Frage, spuckt chatgpt folgendes aus:

python
import os
import re

# Funktion zum Durchsuchen der Datei nach "DDSFormat="
def search_ddsformat(file_path):
with open(file_path, 'r') as file:
content = file.read()
match = re.search(r'DDSFormat=(.*)', content)
if match:
return match.group(1)
else:
return None

# Ordner durchsuchen
root_folder = 'Pfad/zum/Ordner'
output_file = 'ergebnisse.txt'

with open(output_file, 'w') as out_file:
for folder, subfolders, files in os.walk(root_folder):
for file in files:
if file.endswith('.txt'):
file_path = os.path.join(folder, file)
result = search_ddsformat(file_path)
if result:
out_file.write(f'{file_path}: {result}\n')

Kann das irgendjemand verifizieren?

Weil so einen komplexen code führe ich nicht einfach so aus und dann kackt mir irgendwas ab.

jorge42
2023-11-24, 16:00:50
Frag z.B. mal ChatGPT: hab dort einfach deine Frage reinkopiert, das kam als Antwort:

Um das gewünschte Verhalten zu implementieren, benötigen Sie wahrscheinlich eine Skriptsprache wie Python. Hier ist ein einfaches Beispiel, das diese Aufgabe lösen könnte:

python

import os

def scan_folder(folder_path):
# Liste für die gefundenen Treffer
hits = []

# Durchsuche den Ordner und seine Unterordner nach .txt-Dateien
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith(".txt"):
file_path = os.path.join(root, file)

# Öffne die .txt-Datei und suche nach "DDSFormat="
with open(file_path, 'r') as f:
for line in f:
if "DDSFormat=" in line:
# Extrahiere den Wert nach "=" und speichere den Treffer
value = line.split("DDSFormat=")[1].strip()
hits.append(f"DXT5={file_path}")
break # Beende die Suche in dieser Datei, wenn ein Treffer gefunden wurde

# Schreibe die Treffer in eine Ergebnisdatei
with open("ergebnisse.txt", 'w') as result_file:
for hit in hits:
result_file.write(hit + '\n')

# Beispielaufruf für einen Ordnerpfad
scan_folder("Pfad/zum/Ordner")



Dieses Skript durchsucht den angegebenen Ordner und seine Unterordner nach .txt-Dateien. Für jede .txt-Datei wird nach der Zeichenfolge "DDSFormat=" gesucht. Wenn die Zeichenfolge gefunden wird, wird der Wert nach "=" extrahiert und zusammen mit dem Pfad der Datei in die Ergebnisdatei geschrieben.

Beachten Sie, dass dieses Beispiel möglicherweise angepasst werden muss, um genau Ihren Anforderungen zu entsprechen, insbesondere wenn es spezielle Anforderungen an die Verarbeitung der "DDSFormat=" Zeichenfolge gibt.


-> wie gesagt, ich hab nur copy&paste gemacht, obs funktioniert kann ich nicht sagen, aber man kann interaktiv mit chatgpt agieren und kommt mit reiner sprache für so einfach sachen schnell zum ziel....und dazu noch mit kommentiertem und cleanen Code ;)
und wenn er kein python installieren will, wobei das selbst unter windows pille palle ist, kann man chatgpt sicher auch dazu bekommen, das in powershell zu machen.

Hab das mal versucht, dabei kam das hier raus, dabei habe ich folgenden Prompt verwendet
Ich benötige ein Powershell skript, das einen Ordner (und alle seine Unterordner) nach .txt Dateien scann und jede .txt Datei scannt. Falls in der Datei die Zeichenfolge "DDSFormat=" zu finden ist, dann soll in einer Ausgabe-text-Datei der Name und Pfad der Datei in der der Text gefunden wurde ausgegeben werden. Die ausgabe datei soll für alle gefundenen Einträge verwendet werden.
das Ergebnis ist
powershell
Code kopieren

# Pfad des zu durchsuchenden Ordners
$path = "Pfad\Zum\Ordner"

# Name der Ausgabe-Textdatei
$outputFile = "output.txt"

# Scannen jedes Unterverzeichnisses nach .txt-Dateien und durchsuchen jeder Datei
Get-ChildItem $path -Recurse -Filter *.txt | ForEach-Object {
# Überprüfen, ob die Zeichenfolge "DDSFormat=" in der aktuellen Datei vorhanden ist
$match = Select-String -Path $_.FullName -Pattern "DDSFormat=" -Quiet

# Wenn das Muster gefunden wird, füge den Dateinamen und Pfad zur Ausgabedatei hinzu
if ($match) {
Add-Content -Path $outputFile -Value $_.FullName
}
}
sieht für mich ganz gut aus. Bin immer wieder überrascht, was man damit so machen kann, der ignoriert sogar falsche Grammatik oder doppelte Wörter :D

Monger
2023-11-24, 16:11:00
In Powershell kann man Regex übrigens durchaus so schreiben:
if("Hello World!" -match '\w+') {
$hello = $Matches[0]
}

Platos
2023-11-24, 16:13:10
@ Jorge42: Danke für den Tipp.

Ich suche aber nach einem Script, dass nicht einfach nur die Datei ausgibt, in der "DDSFormat=" gefunden wird, sondern es soll ausgegeben werden, was hinter "DDSFormat=" (in der selben Zeile) steht.


Ich habe dann das bekommen und noch gesagt, ich will einen pfad anggeben können für die ausgabedatei und auch, dass das Zeug, wo ich etwas am Skript ändern muss (pfad angeben et c.) in Grossbuchstaben schreiben soll (für die Leute wie mich, die keine Ahnung haben xD )

powershell
# Funktion zum Durchsuchen der Datei nach "DDSFormat="
function Search-DDSFormat {
param (
[string]$filePath
)
$content = Get-Content -Path $filePath
$match = $content | Select-String -Pattern "DDSFormat=(.*)"
if ($match) {
$match.Matches.Value -replace "DDSFormat="
}
}

# Ordner durchsuchen
$rootFolder = "PFAD\ZUM\ORDNER"
$outputFile = "C:\PFAD\ZUR\AUSGABEDATEI\ERGEBNISSE.TXT"

Get-ChildItem -Path $rootFolder -Recurse -Filter *.txt | ForEach-Object {
$result = Search-DDSFormat -filePath $_.FullName
if ($result) {
"$($_.FullName): $result" | Out-File -FilePath $outputFile -Append
}
}

Könnte das jemand bestätigen, ob das funktioniert ?

In Powershell kann man Regex übrigens durchaus so schreiben:
if("Hello World!" -match '\w+') {
$hello = $Matches[0]
}

Könntest du dir das Script durchlesen und sagen, ob das so stimmt, was ChatGPT mir vorgeschlagen hat? Das Skript aus diesem Post hier.

Monger
2023-11-24, 16:38:13
Könntest du dir das Script durchlesen und sagen, ob das so stimmt, was ChatGPT mir vorgeschlagen hat? Das Skript aus diesem Post hier.
Ich glaube es sieht ganz vernünftig aus. Bin nicht sicher ob er das $_ so lange behält, weil das ist ne temporäre Variable. Aber prinzipiell sieht es gut aus.

Platos
2023-11-24, 16:40:17
Ok, danke, dann werde ich es mal mit Testdateien ausprobieren. Ich werde dann berichten.

jorge42
2023-11-24, 16:43:53
@ Jorge42: Danke für den Tipp.

Ich suche aber nach einem Script, dass nicht einfach nur die Datei ausgibt, in der "DDSFormat=" gefunden wird, sondern es soll ausgegeben werden, was hinter "DDSFormat=" (in der selben Zeile) steht.


Ich habe dann das bekommen und noch gesagt, ich will einen pfad anggeben können für die ausgabedatei und auch, dass das Zeug, wo ich etwas am Skript ändern muss (pfad angeben et c.) in Grossbuchstaben schreiben soll (für die Leute wie mich, die keine Ahnung haben xD )

powershell
# Funktion zum Durchsuchen der Datei nach "DDSFormat="
function Search-DDSFormat {
param (
[string]$filePath
)
$content = Get-Content -Path $filePath
$match = $content | Select-String -Pattern "DDSFormat=(.*)"
if ($match) {
$match.Matches.Value -replace "DDSFormat="
}
}

# Ordner durchsuchen
$rootFolder = "PFAD\ZUM\ORDNER"
$outputFile = "C:\PFAD\ZUR\AUSGABEDATEI\ERGEBNISSE.TXT"

Get-ChildItem -Path $rootFolder -Recurse -Filter *.txt | ForEach-Object {
$result = Search-DDSFormat -filePath $_.FullName
if ($result) {
"$($_.FullName): $result" | Out-File -FilePath $outputFile -Append
}
}

Könnte das jemand bestätigen, ob das funktioniert ?



Könntest du dir das Script durchlesen und sagen, ob das so stimmt, was ChatGPT mir vorgeschlagen hat? Das Skript aus diesem Post hier.

dass der bei mir das nicht ausgegeben hat, lag daran, dass ich nicht gefragt hatte :biggrin: aber das ist das Schöne, man kann den Prompt anpassen und einfach neu den Code generieren lassen. Der Code sieht ok aus, ohne den getestet zu haben. Ich hab meinen Prompt angepasst und es kommt etwas gradliniger heraus

# Pfad des zu durchsuchenden Ordners
$path = "Pfad\Zum\Ordner"

# Name der Ausgabe-Textdatei
$outputFile = "output.txt"

# Scannen jedes Unterverzeichnisses nach .txt-Dateien und durchsuchen jeder Datei
Get-ChildItem $path -Recurse -Filter *.txt | ForEach-Object {
# Überprüfen, ob die Zeichenfolge "DDSFormat=" in der aktuellen Datei vorhanden ist
$match = Select-String -Path $_.FullName -Pattern "DDSFormat=" -Quiet

# Wenn das Muster gefunden wird, füge den Dateinamen und Pfad zur Ausgabedatei hinzu und gib den gefundenen Text aus
if ($match) {
$content = Get-Content -Path $_.FullName | Select-String -Pattern "DDSFormat="
Add-Content -Path $outputFile -Value "Datei: $($_.FullName) | Gefundener Text: $($content.Line)"
}
}

Platos
2023-11-24, 16:47:09
Ja, ich habe auch mehrmals nachfragen müssen. Einmal, damit ich den Pfad für die erstellte .txt angeben kann und einmal, damit er für mich deppentauglich das in Grossbuchstaben schreibt, was ich variable eingeben muss xD

Übrigens: Ich habe es jetzt mal probiert mit einem Ordner mit vielen unterordner getestet, der sowohl .txt dateien, die kein "DDSFormat=" enthalten, als auch solche, die es enthalten.

Und ich habe viele resultate erhalten, also scheint es zu funktionieren.

Nice, danke dann für eure Hilfe.

Powershell ist mir btw. wesentlich lieber, da ich dann nix installieren muss und das jeder tun kann.

jorge42
2023-11-24, 16:50:10
Übrigens, du kannst einen beliebigen Code, oder den Code der dir generiert wurde, einfach erläutern lassen. Also
1. erzeuge mir ein Powershell skript, das....
2. erkläre mir für jede Zeile den Code, so dass ich als Powershell Anfänger den Code auch verstehen kann.

Platos
2023-11-24, 17:05:22
Ah ok, danke für die Info. Werde ich dann in Zukunft so machen.