Hallo,
ich möchte eine .txt-Datei nach einem Wort durchsuchen: "files".
Vor diesem Wort wird ein ganzzahliger Wert stehen z.B. 435
Ich möchte die 435 dann in einer Variablen speichern.
Momenten habe ich leider überhaupt keine Idee wie ich die Sache angehen könnte deswegen bitte ich euch um Hilfe.
Zum Hintergrund: Ich möchte die Anzahl der Elemente die in der 7z-Datei vorhanden sind raus kriegen. 7z bietet die möglichkeit, Informationen über den Inhalt auszugeben.
Ich jedoch benötige nur die Anzahl der Elemente.
Ganz unten auf dieser Seite seht ihr wie der Output von 7z aussieht
How to count the amount of files ia .7z
Ich danke euch im Voraus vielmals für eure Tipps!
Mfg
Wo hackt es bzw. was wurde schon versucht?
Eine Txt-Datei einlesen und auszuwerten ist nicht die Welt und somit => X-Tuts im I-Net.
Das Auslesen nicht nein, aber das ich sage das er den Wert davor nehmen soll, da hab ich keinen Ansatz.
Du könntest das Wort (inkl. Zahl) als string abspeichern und dann mit string.split die Zahl separieren.
Hallo Subix,
solche Aufgaben sind ein Klassiker für [Artikel] Regex-Tutorial
Da Regex so praktisch sind rate ich dir das anzueignen, dann lassen sich viele Aufgabe elegant lösen.
Hier z.B. auf die einfache Art: (\d+)\s*files
-> dann steht die Zahl in der 1. Gruppe und kann z.B. per int.Parse
weiterverarbeitet werden.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Das ist mir auch schon auch klar nur wie sage ich das er die beiden nehmen soll, die Zahl ist jedes mal eine andere und somit nicht eindeutig festlegbar.
Die Zahl dann herauszufiltern ist kein Problem jedoch Sie erstmal abzuspeichern daran haderts.
Danke ich schau es mir mal an 😃
Hallo Subix,
hast du meine Antwort gesehen? Die war fast zeitgleich mit deiner, aber dort findest du die Lösung für das Problem.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Warum ein externes SDK für eine Aufgabe verwenden, die man mit 5 Zeilen ohne Abhängigkeit an Dritte umsetzen kann?
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich sag nicht das es schwer ist die Information der Datei zu entnehmen.
Ich wollte nur eine weitere Alternative aufzeigen und ggf. werden ja noch weitere Informationen benötigt.
Warum habe ich dann keine Abhängigkeit?
Irgendwer muss die Datei ja erstellen.
Jetzt kann man darüber diskutieren was besser/schlechter ist SDK oder 7z.exe.
@david.m
Die SDK Lösung wäre von der Umsetzung her wahrscheinlich aufwändiger als direkt die 7z.exe mit entsprechenden Parametern aufzurufen.
Entsprechend würde ich auch diese Lösung vorziehen als ein SDK, was ich dann nur an dieser einen Stelle brauche, einzubinden.
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Wobei der Begriff SDK da evtl. etwas falsch (meiner Meinung nach) gewählt wurde, denn 7Zip bietet hier offensichtlich direkt C# Code an.. was dann okay wäre.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ich habe mir überlegt ich zähle die Zeichen in der letzten Zeile der .txt-Datei, in welcher die Anzahl der Elemente stehen.
Da die .txt vermutlich ein Standartmäßiges Format hat wird die Anzahl wohl immer an der selben Stelle stehen.
Ich lese also die letzte Zeile ein:
string LastLine = File.ReadLines(".\\tmp\\" + name + "_IO" + ".txt").Last();
Das Funktioniert problemlos.
Nun möchte ich das er die ersten 53 Zeichen löscht.
Habe ewig gegooglet und immer nur antworten gefunden wie man z.B. nach einem bestimmten Zeichen trennt aber nicht wie man nach einer bestimmten Anzahl von Zeichen trennt.
Ich wäre sehr dankbar wenn Ihr mir eine Methode die dafür verwendet werden kann nennen könntet!
Danke
Deine Beschreibung dessen, was du vor hast, klingt übrigens nicht sehr vertrauenserweckend, sondern nach einer Mischung aus Vermutung, Hoffnung und Raten. Vielleicht solltest du dir noch mal anschauen, was gfoidl oben schrieb.
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Deine Aussage mit Vermutung, Hoffnung und Raten finde ich unbegründet.
Das mit dem Substring hatte ich mir bereits angeschaut.
Ich möchte das mein String nach 53 Zeichen beginnt das ist mit damit zu lösen.
Dann soll er aber abbrechen wenn ein Leerzeichen erscheint.
Da sich die Länge des Strings bei mir nicht eindeutig bestimmen lässt.
Das ist mit dieser Verwendung von .Substring leider nicht möglich.
Du könntest dir dann den SubString von der entsprechenden Stelle bis zum Ende in einer Variablen halten, per IndexOf den Index des ersten Leerzeichens suchen, dir diesen merken und SubString dann erneut bemühen.
Wo ist das Problem?
String.Substring-Methode (Int32)
String.Split-Methode (Char[])
" 130869837 954273 895 files, 2167 folders".Substring(53).Split(' ')[0]
Aber eine Lösung mit Regex ist eleganter und sicherer.
Deine Aussage mit Vermutung, Hoffnung und Raten finde ich unbegründet.
Nunja, lass das mal auf dich wirken:
Da die .txt vermutlich ein Standartmäßiges Format hat wird die Anzahl wohl immer an der selben Stelle stehen.
Diese beiden Annahmen, zusammen mit der magic number "53" begründen Zweifel an deiner Vorgehensweise durchaus. Nimm es als Hinweis, dass du sie prüfen solltest. (Es wirkt nämlich wie ein vor-sich-hin-frickeln.)
LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
Hallo,
da gebe ich LaTino völlig recht. Man sollte sich NIE auf sowas verlassen, wenn es nicht klar dokumentiert ist. 7z könnte zum Beispiel auch jederzeit das Format ändern (z.B. noch eine zusätzliche Spalte einbauen), so dass der Offset sich verschiebt. Oder es könnt eine auch Spalte je nach Inhalt unterschiedlich breit sein.
Wenn Du die letzte Zeile vernünftig nach dem Wort "files" durchsuchst, und die Zahl davor nimmst, hast Du gute Chancen, dass es auch nach einer etwaigen Formatänderung noch passt (ausser das Format ändert sich ganz grundlegend, aber dann bekommst Du sowieso ein Problem).
Gruß, MarsStein
Edit:
Ich möchte das mein String nach 53 Zeichen beginnt das ist mit damit zu lösen.
Dann soll er aber abbrechen wenn ein Leerzeichen erscheint.
...
Das ist mit dieser Verwendung von .Substring leider nicht möglich.
Es soll tatsächlich Fälle geben, wo man mehrere String-Operationen nacheinander ausführen muss um zum Ergebnis zu kommen... 🤔
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Wie wäre es damit?
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Forum
{
class Program
{
static void Main(string[] args)
{
Regex NUMBERFILES = new Regex(@".+?(\d+)\s*files.+$");
List<string> lastLines = new List<string>();
lastLines.Add(" 130869837 954273 895 files, 2167 folders");
lastLines.Add(" 130869837 954273 1895 files, 2167 folders");
lastLines.Add(" 130869837 954273 4895 files, 2167 folders");
lastLines.Add(" 130869837 954273 10895 files, 2167 folders");
lastLines.Add(" 130869837 954273 298525 files, 2167 folders");
foreach (string lastLine in lastLines)
{
Match match = NUMBERFILES.Match(lastLine);
if ((match != null) && match.Success)
{
string output = lastLine + " =====> " + match.Groups[1].ToString();
Console.WriteLine(output);
}
else
{
Console.WriteLine("Fehler!");
}
}
Console.ReadKey();
}
}
}
Steht dort eigentlich auch "files", wenn im Archiv nur eine Datei ist?