c# String splitten und Vorhandensein bestimmten Teilstring prüfen/lesen

  • Hiho,

    ich habe mir eine Textdatei in eine List<String> eingelesen. Eine Zeile der Textdatei sieht so aus:

    Spoiler anzeigen


    001*Ja|002*ungerade|005*aussen|022*21.02.14|023*09:17:53|024*065|025*50|030*0|031*33301050|032*D|033*RKW|036*u|037*103203|038*1D|043*J


    diese habe ich per .Split('|') in ein String-Array "gepackt" und hole mir bestimmte Werte aus einer festen Arrayposition:

    Spoiler anzeigen


    ...
    for (int i=1; lText.Count>i; i++)
    {
    bool test1 = lText.Contains("GELOESCHT");
    if (test1 == true)
    continue;

    string[] ZeileList = lText.Split('|');
    ListViewItem lvi = new ListViewItem();

    lvi.Text = ZeileList[51].ToString();
    lvi.SubItems.Add(ZeileList[50].ToString());
    lvi.SubItems.Add(ZeileList[49].ToString());
    ArchivList.Items.Add(lvi);
    ...
    }


    Problem hierbei ist, dass die Werte am liebsten durch die "Feldnamen" (00x*) - die aber nicht alle da sein müssen- ausgelesen werden sollen
    Mit ".Contains" könnte ich auf Vorhandensein testen und mir dann das Splitten der Zeile sparen, nur wie teste ich z.B. auf "031*" und lese dann nur den Wert bis zum nxt. Separator "|"??



    EDIT: habs jetzt so aber geht bestimmt eleganter??:


    Spoiler anzeigen


    for (int i=1; lText.Count>i; i++)// nur ab der 2.ten Zeile einlesen i=1
    {
    bool test1 = lText[i].Contains("GELOESCHT"); // is true??
    if (test1 == true)
    continue;
    ListViewItem lvi = new ListViewItem();
    // string[] ZeileList = lText[i].Split('|');
    string Feldn = lText[i].Substring(lText[i].IndexOf("024*")+4, Convert.ToInt32(lText[i].Substring(lText[i].IndexOf("024*")+4).IndexOf("|")));
    string Feldn1 = lText[i].Substring(lText[i].IndexOf("033*") + 4, Convert.ToInt32(lText[i].Substring(lText[i].IndexOf("033*") + 4).IndexOf("|")));
    string Feldn2 = lText[i].Substring(lText[i].IndexOf("052*") + 4, Convert.ToInt32(lText[i].Substring(lText[i].IndexOf("052*") + 4).IndexOf("|")));
    lvi.Text = Feldn2;
    lvi.SubItems.Add(Feldn1);
    lvi.SubItems.Add(Feldn);
    ArchivList.Items.Add(lvi);

    }

    Einmal editiert, zuletzt von Torni (7. März 2014 um 19:28)

  • so vielleicht?

    Code
    Regex regex = new Regex(@"([0-9]{3})\*(\w+)");
    Match match = regex.Match("001*Ja|002*ungerade|005*aussen|022*21.02.14|023*09:17:53|024*065|025*50|030*0|031*33301050|032*D|033*RKW|036*u|037*103203|038*1D|043*J");
                while (match.Success)
                {
                    Console.WriteLine("Nummernwert: " + match.Groups[1].Value + "  Wert :" + match.Groups[2].Value);
                    match = match.NextMatch();
                }


    sollte ausgabe so aussehen:

    Spoiler anzeigen

    Nummernwert: 001 Wert :Ja
    Nummernwert: 002 Wert :ungerade
    Nummernwert: 005 Wert :aussen
    Nummernwert: 022 Wert :21
    Nummernwert: 023 Wert :09
    Nummernwert: 024 Wert :065
    Nummernwert: 025 Wert :50
    Nummernwert: 030 Wert :0
    Nummernwert: 031 Wert :33301050
    Nummernwert: 032 Wert :D
    Nummernwert: 033 Wert :RKW
    Nummernwert: 036 Wert :u
    Nummernwert: 037 Wert :103203
    Nummernwert: 038 Wert :1D
    Nummernwert: 043 Wert :J


    Franz

    ---
    In "Independence Day" konnten die Windows-Erdcomputer problemlos mit denen der Außerirdischen kommunizieren. Was sagt uns das über unseren lieben Bill Gates? :D
    ---