Laden...

Datei nach einem Wort durchsuchen und die Zahl davor speichern

Erstellt von Subix vor 7 Jahren Letzter Beitrag vor 7 Jahren 4.729 Views
S
Subix Themenstarter:in
12 Beiträge seit 2016
vor 7 Jahren
Datei nach einem Wort durchsuchen und die Zahl davor speichern

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

J
251 Beiträge seit 2012
vor 7 Jahren

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.

S
Subix Themenstarter:in
12 Beiträge seit 2016
vor 7 Jahren

Das Auslesen nicht nein, aber das ich sage das er den Wert davor nehmen soll, da hab ich keinen Ansatz.

121 Beiträge seit 2016
vor 7 Jahren

Du könntest das Wort (inkl. Zahl) als string abspeichern und dann mit string.split die Zahl separieren.

6.911 Beiträge seit 2009
vor 7 Jahren

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!"

S
Subix Themenstarter:in
12 Beiträge seit 2016
vor 7 Jahren

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 😃

6.911 Beiträge seit 2009
vor 7 Jahren

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!"

D
152 Beiträge seit 2013
vor 7 Jahren

Warum nicht das LZMA SDK (Software Development Kit) verwenden um die Informationen zu ermitteln?

16.834 Beiträge seit 2008
vor 7 Jahren

Warum ein externes SDK für eine Aufgabe verwenden, die man mit 5 Zeilen ohne Abhängigkeit an Dritte umsetzen kann?

D
152 Beiträge seit 2013
vor 7 Jahren

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.

T
2.224 Beiträge seit 2008
vor 7 Jahren

@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.

16.834 Beiträge seit 2008
vor 7 Jahren

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.

S
Subix Themenstarter:in
12 Beiträge seit 2016
vor 7 Jahren

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

3.003 Beiträge seit 2006
vor 7 Jahren

String.SubString(int, int)

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)

S
Subix Themenstarter:in
12 Beiträge seit 2016
vor 7 Jahren

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.

709 Beiträge seit 2008
vor 7 Jahren

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.

D
152 Beiträge seit 2013
vor 7 Jahren

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.

3.003 Beiträge seit 2006
vor 7 Jahren

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)

3.170 Beiträge seit 2006
vor 7 Jahren

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

187 Beiträge seit 2009
vor 7 Jahren

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();
        }
    }
}
709 Beiträge seit 2008
vor 7 Jahren

Steht dort eigentlich auch "files", wenn im Archiv nur eine Datei ist?