.Split bei neuer leerer Zeile

  • C#

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von LaMiy.

    .Split bei neuer leerer Zeile

    Ich habe folgenden Code:

    PHP-Quellcode

    1. public Dictionary<int, string> Parts(string input)
    2. {
    3. Dictionary<int, string> d = new Dictionary<int, string>();
    4. string[] words = input.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
    5. foreach (string i in words)
    6. {
    7. d.Add(index, i);
    8. index = index + 1;
    9. }
    10. return d;
    11. }

    Ich möchte aber, dass er bei einer leeren neuen Zeile splittet.
    Beispiel:

    Quellcode

    1. a
    2. b
    3. c
    4. d
    5. e
    6. f

    Quellcode

    1. Result(0) = a,b,c
    2. Result(1) = d,e

    Hat jemand eine Idee ?
    Versuch es mal mit zwei verketteten Umbrüchen.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    In C# kannst du mit \ "besondere Zeichen" erzeugen.
    \n = NewLine
    \t = Tabulator
    ...

    Quellcode

    1. foreach(var i in words.Split(new string[]{"\n\n"}, ...))
    2. {
    3. ...
    4. }


    Wenn jedoch in der leeren Zeile noch was ist dann haste nen Problem.
    Deshalb vll. noch nen words = words.Replace("\t", String.Empty).Replace("\t", String.Empty)
    Kp. wie das sauber geht. Regex vll.?


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ich habe mal eine Mischung aus Beidem probiert:

    Quellcode

    1. public Dictionary<int, string> Parts(string input)
    2. {
    3. Dictionary<int, string> d = new Dictionary<int, string>();
    4. string[] words = input.Split(new char[] { '\n', '\n' }, StringSplitOptions.None);
    5. foreach (string i in words)
    6. {
    7. d.Add(index, i);
    8. index = index + 1;
    9. }
    10. return d;
    11. }

    Klappt nicht so wie es soll. Ich erhalte das selbe Ergebnis wie vorher, nämlich jede Zeile einzeln.
    @LaMiy: { '\n', '\n' } ist nicht gerade sinnvoll. (Edit: { "\n" + " "} ist auch nicht gerade sinnvoll.) String.Split(Char[], StringSplitOptions) splittet an einem beliebigen Zeichen im Char-Array.
    Verwende Input.Split("UmbruchUmbruch") Input.Split(New String() {"UmbruchUmbruch"}, StringSplitOptions.None) (also zwei Umbrüche direkt aneinander in einem String).

    Was aber interessant wäre, ist, welche Umbrüche verwendet werden (also CrLf oder nur Cr oder nur Lf).
    Gehe mal deine Testdaten (also Daten, die Du wirklich verwendest, nicht selbst eingegebene durch und lass Dir die Zeichencodes ausgeben.
    Also so:

    C#-Quellcode

    1. MessageBox.Show(String.Join(", ", Array.ConvertAll(Input.ToArray(), (Char c) => Convert.ToByte(c))));
    Ich bin mir nicht sicher, ob ich die Syntax richtig habe. Ist aus dem Kopf geschrieben.
    (Tipp: Aus MessageBoxen kann man mit Ctrl+C den Inhalt kopieren, dann musst Du nicht abtippen.)

    Wenn Du jetzt z.B. diesen Input-String hast:

    Quellcode

    1. Test
    2. Test
    3. Test

    Dann sollten zuerst 4 Zahlen von "Test" kommen, dann die Zahlen vom Umbruch dann wieder die 4 Zahlen von "Test", dann zweimal die Zahlen von den Umbrüchen, dann wieder die Zahlen von "Test".
    Die Umbruch-Zahlen sind entweder "13" (bei Cr), "10" (bei Lf) oder "13, 10" (bei CrLf).

    Edit 2:
    Bei dem Beispiel oben kommt das heraus:

    Quellcode

    1. 84, 101, 115, 116, 13, 10, 84, 101, 115, 116, 13, 10, 13, 10, 84, 101, 115, 116

    Man sieht zuerst 84, 101, 115, 116 von "Test", dann 13, 10 vom Umbruch, dann wieder 84, 101, 115, 116, dann 13, 10, 13, 10 (also zweimal 13, 10) und dann wieder 84, 101, 115, 116.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Niko Ortner“ ()

    @Niko Ortner

    Quellcode

    1. Convert.ToByte(c))));
    muss es hinten heißen.
    Ich habe es jetzt so:

    Quellcode

    1. string[] words = input.Split(new string[] { "\n \n"}, StringSplitOptions.None);

    Und mein Input sieht so aus:

    Quellcode

    1. Name
    2. unwichtig...
    3. unwichtig..
    4. Name
    5. unwichtig...

    Wenn ich die oben genannte Methode anwende und dann das sage:

    Quellcode

    1. Dictionary<int, string> d = handle.getParts(textBox2.Text);
    2. foreach (KeyValuePair<int, string> i in d)
    3. {
    4. MessageBox.Show(handle.getName(i.Value));
    5. }

    Bekomme ich nur den Namen vom ersten Item, nicht vom zweiten.
    @LaMiy:
    Der Umbruch ist ein normales CrLf:


    Ich habe es hiermit probiert:

    VB.NET-Quellcode

    1. Dim Path = "C:\Users\Niko\Desktop\Input.txt"
    2. Dim Content = System.IO.File.ReadAllText(Path, System.Text.Encoding.Default)
    3. Dim Parts = Content.Split(New String() {Environment.NewLine & Environment.NewLine}, StringSplitOptions.None)

    Damit hat es aber nicht funktioniert (es wurde der gesamte Inhalt zurückgegeben).

    Ich bin testweise jedes zeichen durchgegangen und da hat mich ein Leerzeichen am Ende der zweiten Zeile der Datei etwas verwundert. Und dann bin ich draufgekommen, dass in der vermeintlich leeren Zeile auch ein Leerzeichen ist (Hier jede Zeile zwischen > und <):

    Quellcode

    1. >Name1<
    2. >Es liegen 1 bearbeitete Kostenvoranschläge für Sie vor. <
    3. >Davon sind 1 Kostenvoranschläge genehmigt worden. <
    4. >Belegnummer ...<
    5. > <
    6. >Name2<
    7. >Es liegen 3 bearbeitete Kostenvoranschläge für Sie vor. <
    8. >Davon sind 3 Kostenvoranschläge abgelehnt worden. <
    9. >Belegnummer ...<
    10. >Belegnummer ...<
    11. >Belegnummer ...<


    Ändert man den Delimiter auf Environment.NewLine & " " & Environment.NewLine, funktioniert alles problemlos:


    Woher kommt Dein Input-String?
    Da sollte man etwas besser auf die Ausgabe achten. Leerzeichen sind nämlich nur schwer sichtbar und haben am Ende einer Zeile (und erst recht in leeren Zeilen) üblicherweise nichts zu suchen, wenn es sich um Programmdaten handelt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils