2016-11-30 2 views
0

Ich habe einen Wert "md5: [md5 Wert hier]", der auf halbem Weg über eine Zeile etwa 15 Zeilen in eine Textdatei erscheint.Holen Wert von überall in einer Textdatei

IE:

File was uploaded successfully, md5: [md5_value_would_be_here] 

Ich habe keine Kontrolle über die txt-Dateien Inhalte so kippe den Wert in eine neue Zeile schreiben, dann ziehen.

In C# Wie würde ich gehen, um den Wert von MD5: (Ich weiß, in Batch konnte ich einen suchen und ersetzen, aber völlig ausgeblendet, wie es in C#).

Jede Hilfe dankbar :)

here, was ich bisher bin mit ...

var data = File 
       .ReadAllLines("file.txt") 
       .Select(x => x.Split('=')) 
       .Where(x => x.Length > 1) 
       .ToDictionary(x => x[0].Trim(), x => x[1]); 

string serverFileMD5 = data["md5"]; 

Dank

Update:

Die folgende Erfolg nicht erreicht,

String data = File.ReadAllText("File.txt"); 
      String pattern = "md5: ([a-zA-Z0-9]*) "; 
      Regex reg = new Regex(pattern); 
      Match m = reg.Match(data); 
      if (m.Success) 
      { 
       Group g = m.Groups[1]; // This should be the hash 
       Console.WriteLine("value of g: " + g); 
       serverFileMD5 = g.Value; 
      } 
+2

Und was ist das Problem mit diesem Code? Ein Beispiel für Ihre Datei könnte hier sehr nützlich sein. – Steve

+2

Das Beispiel, das Sie angegeben haben, enthält kein einziges '=', aber das verwenden Sie, um die Zeilen zu teilen. –

+0

Warum die '()' in die Regex? –

Antwort

5

Wahrscheinlich die einfachste Möglichkeit, dies zu tun, ist mit Regex. Erstens würde ich wahrscheinlich die gesamte Datei in einem einzelnen String lesen:

String content = File.ReadAllText()

Dann können Sie etwas in den folgenden Zeilen verwenden:

String pattern = "md5: \[([a-zA-Z0-9]*)\]"; 
Regex reg = new Regex(pattern); 
Match m = reg.Match(content); 
if(m.Success) { 
    Group g = m.Groups[1]; // This should be the hash 
    String hash = g.Value; 
} 

Diese die Annahme macht, dass Sie Hash sind enthält Großbuchstaben, Kleinbuchstaben und Zahlen. Es funktioniert wie folgt:

md5: - buchstäblich für md5: sieht das passende

\[ zu starten - sieht für eine offene Klammer, die \ für die Flucht

(...) verwendet wird - eine passende Gruppe erstellt, das Bit Das passt hier in m.Groups[1] macht es einfacher, auf das Ergebnis zuzugreifen.

[a-zA-Z0-9]* - Dies ist der lange Weg zu sagen, mit einem Buchstaben oder einer Zahl zu entsprechen. Beachten Sie, dass die * bedeutet, dass viele von diesen übereinstimmen, ohne dass es nur das erste Zeichen aufnehmen würde.

\] - einfach für eine Klammer suchen, wieder

entging Wenn Sie mehr Informationen über Regex benötigen Sie um die Aufnahme zu helfen zu ändern, würde ich einfach so ein Spickzettel empfehlen Auschecken als Regexlib.com

+0

Danke dafür! Was aber wäre die Regex, wenn die Klammern Leerzeichen wären? \ s? – user2295457

+0

@ user2295457 die eckigen Klammern '' und '' '? Tauschen Sie sie einfach mit Leerzeichen im Muster aus. Leerzeichen werden buchstäblich als Leerzeichen behandelt, in der Tat können Sie das an der 'md5: \ [' sehen, die ein Leerzeichen enthält. Die '(' und ')' Klammern müssen da sein, um die passende Regex-Gruppe zu erstellen, das sind Sonderzeichen und ** ** sucht nicht nach denen in der ursprünglichen Zeichenkette, damit Sie sie ignorieren können. – Ian

+0

OK also, es war die Regex (Notepad ++ zeigte einige Zeichen in der Datei nicht, überprüft mit normalen Notizblock revlealed kein Startplatz char, und ein = Trailing ... Jetzt müssen nur 4 Zeichen von links trimmen (die "md5:") in meinem Ausgabe-String und ich bin gut! Vielen Dank :) – user2295457

1

Angenommen, Sie nur einen einzigen MD5-Hash der Länge finden wollen 32, der immer den Text folgt md5: (einschließlich Leerzeichen), diese einfache Lösung sollte ausreichen:

var data = File.ReadAllLines(@"C:\somewhere\DummyTextWithHash.txt"); 
var lineWithMd5 = data.First(line => line.Contains("md5: ")); 
var md5StartPos = lineWithMd5.IndexOf("md5:").Dump(); 
var md5Value = lineWithMd5.Substring(md5StartPos + 5, 32); 

das i s ziemlich explizit und sollte hoffentlich vollständig selbsterklärend sein.

Eine Sache allerdings zu beachten: data.First(...) eine Ausnahme auslösen kann, wenn kein MD5-Wert in der Datei gefunden wird (in der Regel Sequence contains no matching element..). Wenn Sie nicht sicher sind, ob in der Datei immer ein MD5 vorhanden sein wird, verwenden Sie stattdessen FirstOrDefault() und prüfen Sie, ob vor dem Extrahieren des Werts etwas zurückgegeben wird (es wird null zurückgegeben, wenn keine Übereinstimmung gefunden wurde).