ludaku
Goto Top

Daten aus txt-Files sammeln

Moin face-smile

Erstmal: Ich habe kein gescheites Unterforum dafür gefunden, falls ihr ein besseres findet bin ich froh darum..

Ich habe hier seeehr viele txt-Files, welche folgendes Format haben:
Titel1: Wert
Titel2: Wert
Titel3: Wert
Titel4:
>> Wert Nr. 1
>> Wert Nr. 2
>> Wert Nr. 3

Dabei verändert sich die Anzahl der Werte bei Titel4 je nach txt-File.
Nun muss auch aus all diesen txt-Files den Wert von Titel2 und den jeweils letzten Wert von Titel4 herausfinden. Dabei ist egal ob der jeweilige Titel mitgeliefert wird oder auch nicht.

Wie könnte ich diese Daten aus den vielen Dateien sammeln, ohne dass ich dies von Hand machen muss?

LG MbGb

Content-Key: 331671

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

Printed on: April 23, 2024 at 20:04 o'clock

Member: colinardo
Solution colinardo Mar 09, 2017 updated at 09:29:59 (UTC)
Goto Top
Servus,
da du hier leider kein OS nennst hier eine Skript-Variante mit Powershell. Es durchsucht einen Ordner mit seinen Unterordnern nach Textdateien *.txt und gibt nur die reinen Werte in eine Textdatei aus.
$quelle = 'D:\Ordner'  
$zieldatei = 'D:\ergebnis.txt'  
gci $quelle -Filter *.txt -recurse | ?{!$_.PSIsContainer} | %{
    [regex]::Matches((gc $_.Fullname -Raw),'(?ism)^Titel2:\s*([^\r\n]*)|^Titel4:.*^>> ([^\r\n]*)').Captures | %{$_.Groups[1..2].Value |?{$_ -ne ""}}  
} | set-content $zieldatei
Viel Spaß
Grüße Uwe
Member: ludaku
ludaku Mar 09, 2017 updated at 11:58:32 (UTC)
Goto Top
Sorry, die wichtigen Dinge die für mich selbstverständlich sind vergesse ich immer. Wohl eine meiner Schwächen :/
Wow super, danke!
Ich habe es entsprechend ein wenig angepasst und es hat sofort funktioniert. face-smile
Wenn ich un noch den Wert von Titel3 rausfiltern will, wie mache ich das? Ist das so korrekt:
$quelle = 'D:\Ordner'  
$zieldatei = 'D:\ergebnis.txt'  
gci $quelle -Filter *.txt -recurse | ?{!$_.PSIsContainer} | %{
    [regex]::Matches((gc $_.Fullname -Raw),'(?ism)^Titel2:\s*([^\r\n]*)|^Titel3:.*^>> ([^\r\n]*)|^Titel4:.*^>> ([^\r\n]*)').Captures | %{$_.Groups[1..2].Value |?{$_ -ne ""}}  
} | set-content $zieldatei
EDIT: Gerade getestet, das funktioniert nicht.. Die Console gibt mir zwar keine Fehlermeldung aus, aber der entsprechende Wert von Titel 3 wird nicht in das File geschrieben. (Verzeih mir, ich bin wirklich eine Vollniete was PS angeht..
Member: colinardo
colinardo Mar 09, 2017 updated at 12:05:31 (UTC)
Goto Top
Das geht indem Fall dann nicht mehr da ich davon ausging das nur ein Bereich mit mehreren Items existiert, in dem Fall mach es so
$quelle = 'D:\Ordner'  
$zieldatei = 'D:\ergebnis.txt'   
[regex]::matches((gc "$quelle\*.txt" -raw | out-string),'(?ism)^Titel2: ([^\r\n]*)|^Titel[34]:.*?^>> ([^\r\n]+)\s*(?=^Titel|\Z)').Captures | %{$_.Groups[1..2].Value |?{$_ -ne ""}} | set-content $zieldatei  
Verzeih mir, ich bin wirklich eine Vollniete was PS angeht..
Das was du hier brauchst ist Regex
Regular Expressions Tutorial
Lerne es und du kannst alles extrahieren was du dir vorstellen kannst face-smile. Kannst du in jeder Skript und Programmiersprache verwenden.

Sorry wenn ich dir jetzt hier den Regex nicht weiter erläutere, das würde Tage dauern face-smile.
Member: ludaku
ludaku Mar 09, 2017 at 12:12:07 (UTC)
Goto Top
Zitat von @colinardo:
Das geht indem Fall dann nicht mehr da ich davon ausging das nur ein Bereich mit mehreren Items existiert, in dem Fall mach es so
Titel4 ist der einzige bereich mit mehreren Items. Titel3 hat auch nur ein Item.

> $quelle = 'D:\Ordner'  
> $zieldatei = 'D:\ergebnis.txt'   
> [regex]::matches((gc "$quelle\*.txt" -raw | out-string),'(?ism)^Titel2: ([^\r\n]*)|^Titel[34]:.*?^>> ([^\r\n]+)\s*(?=^Titel|\Z)').Captures | %{$_.Groups[1..2].Value |?{$_ -ne ""}} | set-content $zieldatei  
> 
Ein wenig RegEx kann ich... Darum sehe ich hier nun das nächste Problem: Titel1,2,3 usw sind Pseudonamen, die euch den Thread ein wenig vereinfachen sollten. Auch die Struktur der Files ist stark vereinfacht. In der Realität gaben diese aber Eigennamen ohne Nummerierungen.. Sprich die Expression "Titel[34]" wird nicht funktionieren..
Titel2 => "Computer Name"
Titel3 => "Windows Version"
Titel4 => ".NET Frameworks"

Verzeih mir, ich bin wirklich eine Vollniete was PS angeht..
Das was du hier brauchst ist Regex
Regular Expressions Tutorial
Lerne es und du kannst alles extrahieren was du dir vorstellen kannst face-smile. Kannst du in jeder Skript und Programmiersprache verwenden.
Lerne es.. Ist einfacher gesagt als getan. Aber steht auf meiner ToDo Liste. Genau so wie PS zu lernen face-smile
Member: colinardo
Solution colinardo Mar 09, 2017 updated at 12:29:05 (UTC)
Goto Top
Zitat von @ludaku:
Titel4 ist der einzige bereich mit mehreren Items. Titel3 hat auch nur ein Item.
Na dann kannst du beim alten bleiben:
$quelle = 'D:\Ordner'  
$zieldatei = 'D:\ergebnis.txt'  
gci $quelle -Filter *.txt -recurse | ?{!$_.PSIsContainer} | %{
    [regex]::Matches((gc $_.Fullname -Raw),'(?ism)^Titel2:\s*([^\r\n]*)|^Titel3:\s*([^\r\n]*)|^Titel4:.*^>> ([^\r\n]*)').Captures | %{$_.Groups[1..3].Value |?{$_ -ne ""}}  
} | set-content $zieldatei
Du brauchst dann nur den Teil: ^Titel2:\s*([^\r\n]*) duplizieren und mit deinem String versehen, aber denke dran Sonderzeichen bei den Namen zu beachten.Denn der Punkt in .NET Framwork würde jedes belibige Zeichen matchen, also escapen mit \.

Wenns das dann war, den Beitrag bitte noch auf gelöst setzen, und Lösungen markieren. Merci.

Grüße Uwe
Member: ludaku
ludaku Mar 09, 2017 at 13:20:15 (UTC)
Goto Top
Das habe ich bereits probiert.. Er holt mir aber dann nur den Wert von Titel2 und von Titel3.. Jedoch gibt er mit in $zeildatei den letzten Wert von Titel4 nicht aus..

LG Luca
Member: colinardo
colinardo Mar 09, 2017 updated at 13:40:48 (UTC)
Goto Top
Kann ich nicht bestätigen, geht hier im Test einwandfrei!
Hast du hinten den Array-index von [1..2] wirklich auf [1..3] geändert?
Member: ludaku
ludaku Mar 10, 2017 updated at 07:41:22 (UTC)
Goto Top
Hab gestern gemerkt, dass es auf [1..2] stand und nicht auf [1..3].. Ich hatte das copy und paste eingefügt..
Hast du das nachträglich eingefügt/angepasst oder muss ich weiter an meinem Verstand zweifeln? (◔_◔)

Jetzt kommt ein ganz schwieriger Part (finde ich..) Der ging bei mir ganz unter..
Ich brauche jetzt auch noch aus dem Dateinamen, wo er die Daten rausholt einen String..
Member: colinardo
colinardo Mar 10, 2017 at 07:42:10 (UTC)
Goto Top
Hat sich wahrscheinlich überschnitten, hatte das kurz nach dem Posten noch korrigiert.
Member: ludaku
ludaku Mar 10, 2017 updated at 07:45:57 (UTC)
Goto Top
Sorry konnte das nicht in einen Post packen:

Jetzt kommt ein ganz schwieriger Part (finde ich..) Der ging bei mir ganz unter..
Ich brauche jetzt auch noch aus dem Dateinamen, wo er die Daten rausholt einen String..
Die Dateinamen sind so aufgebaut: "CLIENT_INFOS-XXXX{hier kommen noch ein paar Zeichen, Länge ist dabei unbekannt}" und ich brauche nun das XXXX. Ich denke mal das ist mit Powershell lösbar oder?


Zitat von @colinardo:
Hat sich wahrscheinlich überschnitten, hatte das kurz nach dem Posten noch korrigiert.
Gut, dann bin ich ja doch (noch) nicht verrückt :D
Member: colinardo
Solution colinardo Mar 10, 2017 updated at 07:53:33 (UTC)
Goto Top
Zitat von @ludaku:

Sorry konnte das nicht in einen Post packen:

Jetzt kommt ein ganz schwieriger Part (finde ich..) Der ging bei mir ganz unter..
Ich brauche jetzt auch noch aus dem Dateinamen, wo er die Daten rausholt einen String..
Die Dateinamen sind so aufgebaut: "CLIENT_INFOS-XXXX{hier kommen noch ein paar Zeichen, Länge ist dabei unbekannt}" und ich brauche nun das XXXX. Ich denke mal das ist mit Powershell lösbar oder?
Kein Problem, in der Schleife von oben kommst du so an die Info vom Dateinamen
$_.Basename.split("-")[1]  
oder auch
$_.Basename.Substring(12)
oder auch
$_.Basename -replace '^CLIENT_INFOS-(.*)','$1'  
Member: ludaku
ludaku Mar 10, 2017 updated at 07:53:43 (UTC)
Goto Top
Zitat von @colinardo:
Kein Problem, in der Schleife von oben kommst du so an die Info vom Dateinamen
Oh Gott, ich kann VB.NET aber sehe da noch nicht mal eine Schleife.. Das kann mir ja heiter werden. Es wird dringen Zeit, dass ich Powershell lerne :'D
> $_.Basename.split("-")[1]  
> 
Also gibt mir das den vollen Dateinamen aus?
EDIT: Char0 bis Char12,oder?
Member: colinardo
colinardo Mar 10, 2017 updated at 07:55:57 (UTC)
Goto Top
Nur das was du oben extrahieren wolltest... Das XXXX

Weitere Möglichkeiten sind oben aufgeführt!

Such dir eins aus.

p.s. Es gibt auch Dokumentationen face-wink

So, muss jetzt weg, bis bald.
Member: skeppi
skeppi Mar 11, 2017 updated at 02:37:48 (UTC)
Goto Top
Hallo,

ich habe eine sehr sehr ähnliche Frage, bin aber auf biegen und brechen nicht in der Lage deine Lösungen so anzupassen, dass es auch für meine Zwecke geht, da ich mit der PowerShell überhaupt nicht zurecht komme. Hoffe mal, dass du mir vielleicht helfen kannst:

ich habe mir eine batch geschrieben, die mittels wget alle 10 minuten ein image von einer website lädt und als "nameTT.MM.JJJJ HH.MM.SS.html" speichert. dafür hat's gereicht face-smile

in jeder dieser dateien existiert ein nur einmal vorhandener block namens <span class="text-large" id="quote_size">SIZE</span>, wovon ich die SIZE in abhängigkeit von datum und uhrzeit in excel weiterverarbeiten / plotten muss.

ideal wäre, denke ich, eine csv datei mit dem format TT.MM.JJJJ; HH.MM.SS; SIZE pro input-datei und zeile, wobei da noch ein potentielles problem bei ein- und zweistelligen werten im datum und der zeit liegen könnte, aber das sollte ich hoffentlich excel-intern lösen können.

kann mir da jemand helfen? ^^ face-smile
Member: colinardo
colinardo Mar 11, 2017 updated at 06:34:39 (UTC)
Goto Top
@skeppi Schau doch bitte erst mal in die Forenrichtlinien: Dort steht aus gutem Grund "Übernehme keine Beiträge von anderen" denn das führt für andere die hier vorbei kommen zur Verwirrung. DANKE!
Wenn du von mir persönlich Hilfe willst melde dich per PN oder mach einen neuen Thread mit der Frage auf. Merci.

Grüße Uwe
Member: ludaku
ludaku Mar 13, 2017 at 07:48:24 (UTC)
Goto Top
Back to Topic:
Hat geklappt, danke für die Hilfe @colinardo !

LG