Ich erstelle eine C# WinForms-App, die alle Vorkommen eines Strings innerhalb einer Datei finden, den Text dazwischen abschneiden und dann eine Verarbeitung durchführen muss.
Die Textdatei hat das folgende Format:
---- Schlüssel_String ----
Text zum Abschneiden 1
---- Schlüssel_String ----
Text zum Abschneiden 2
---- Schlüssel_String ----
Text zum Abschneiden 3
Im Grunde schneide ich "Text1", "Text2" und "Text3" aus dieser Datei heraus.
Und hier ist der Code, um die genannte Aktion auszuführen:
string inhalt = "";
MatchCollection treffer;
using (StreamReader leser = File.OpenText(dateipfad))
{
inhalt = leser.ReadToEnd();
treffer = Regex.Matches(inhalt, "Schlüssel_String");
}
int gesamtanzahl = treffer.Count;
for (int i = 0; i < gesamtanzahl; i++)
{
int indd1 = treffer[i].Index;
int indd2 = 0;
string unterinhalt = "";
if (i != gesamtanzahl - 1)
{
indd2 = treffer[i+1].Index;
try
{
unterinhalt = inhalt.Substring(indd1, indd2); // Fehler hier
}
catch
{
MessageBox.Show("Index 1: " + indd1 + "\n" +
"Index 2: " + indd2 + "\n" +
"Maximaler Index (Länge - 1): " + (inhalt.Length - 1)
);
}
}
else { unterinhalt = inhalt.Substring(indd1); }
// Verarbeitung von "unterinhalt"
}
Das funktioniert gut für einige meiner Dateien, jedoch erhalte ich in einigen Fällen folgenden Fehler:
Index und Länge müssen auf einer Position innerhalb des Strings verweisen. Parametername: Länge
Es ist sehr seltsam, weil der Unterstring, den ich abschneide, sich INNERHALB des Hauptstrings befindet, und nicht außerhalb, wie Sie vermutet haben. Ich kann es mit der Ausgabe des "try-catch" beweisen:
Index 1: 3211
Index 2: 4557
Maximaler Index (Länge - 1): 5869
Wie Sie sehen können, schneide ich nichts ab, das außerhalb des Indexbereichs liegt, also wo liegt das Problem?
P.S. Ich habe Lösungen gegoogelt, aber die Grundidee in jedem Fall ist - "falscher Index". In meinem Fall - ist der Index "innerhalb" des Bereichs. Nun ja, zumindest denke ich das.
Bearbeiten
Etwas Ähnliches wie dies sollte das Problem lösen:
public string SubstringFix(string original, int start, int end)
{
int endindex = 0;
if (end < original.Length)
{
endindex = end;
}
else
{
endindex = original.Length - 1;
}
return original.Substring(start, (end - start));
}