2017-09-18 3 views
0

Ich habe eine Datei, die der folgenden ähnelt:So finden Sie Text zwischen zwei Registerkarten

Tomas | Nordstrom | Schweden | Europa | Welt

(das Zeichen „|“ in der oberen Zeile steht für eine Registerkarte neue Spalte)

Jetzt möchte ich eine Zeichenfolge nur den Text in der vierten Spalte enthält.

Es ist mir gelungen, Zeichen an einer bestimmten Stelle in der Zeile zu finden. Aber dieser Punkt ändert sich entsprechend der Anzahl und den Zeichen in jeder Spalte. Ich könnte wirklich einen netten Input dazu brauchen.

Vielen Dank im Voraus.

/Tomas

+2

Suchen Sie nach "String.Split". – InBetween

+1

Aufteilen nach '\ t' und gehen Sie zu Index 3 –

+4

Mögliches Duplikat von [Separate Zeichenfolge nach Tabulatorzeichen] (https://stackoverflow.com/questions/2797647/separate-string-by-tab-characters) – TNU

Antwort

1

Dies kann mit der Split Methode wie folgt geschehen:

string s = "Tomas|Nordstrom|Sweden|Europe|World"; 
string[] stringArray = s.Split(new string[] { "|" }, StringSplitOptions.None); 

Console.WriteLine(stringArray[3]); 

Dies wird "Europa" ausdrucken, weil das am Index 3 in String befindet.

Edit:

Das gleiche erreicht werden kann Regex wie folgt aus:

string[] stringRegex = Regex.Split(s, @"\|+"); 
0

Basisalgorithmus würde Iterieren Zeichen lang sein, bis n-1 Registerkarten gefunden, dann Zeichen nehmen bis zum nächsten Tab oder das Ende der Zeichenfolge.

Je nach Anforderungen müssen Sie möglicherweise, wenn die Leistung entscheidend ist, einen Scanalgorithmus manuell implementieren.

Sie könnten überrascht sein, wie langsam die Saitenspaltung ist. Nun - es ist nicht nicht von selbst, sondern das Gesamtkonzept erfordert:

  • Scannen bis zum Ende des Strings
  • Erstellung aller der getrennten Teile auf Haufen
  • sammelt Müll

Betrachten Sie den folgenden Benchmark der beiden Ansätze:

void Main() 
{ 
    string source = "Tomas\tNordstrom\tSweden\tEurope\tWorld"; 

    var sw = Stopwatch.StartNew(); 

    string result = null; 

    var n = 100000000; 

    for (var i = 0; i < n; i++) 
    { 
     result = FindBySplitting(source); 
    } 

    sw.Stop(); 

    var splittingNsop = (double)sw.ElapsedMilliseconds/n * 1000000.0; 
    Console.WriteLine("Splitting. {0} ns/op",splittingNsop); 

    Console.WriteLine(result); 

    sw.Restart(); 

    for (var i = 0; i < n; i++) 
    { 
     result = FindByScanning(source); 
    } 

    sw.Stop(); 

    var scanningNsop = (double)sw.ElapsedMilliseconds/n * 1000000.0; 
    Console.WriteLine("Scanning. {0} ns/op", 
     scanningNsop); 

    Console.WriteLine(result); 

    Console.WriteLine("Scanning over splitting: {0}", splittingNsop/scanningNsop); 
} 

string FindBySplitting(string s) 
{ 
    return s.Split('\t')[3]; 
} 

string FindByScanning(string s) 
{ 
    int l = s.Length, p = 0, q = 0, c = 0; 
    while (c++ < 4 - 1) 
     while (p < l && s[p++] != '\t') 
      ; 
    for (q = p; q < l && s[q] != '\t'; q++) 
     ; 
    return s.Substring(p, q - p); 
} 

Scan-Algorithmus in reinem C# implementiert Übertrifft die auf dem niedrigen Niveau um einen Faktor von 4,6 auf meinem niedrigen Laptop implementiert Spaltung:

Splitting. 174.81 ns/op 
Europe 
Scanning. 37.58 ns/op 
Europe 
Scanning over splitting: 4.65167642362959 
+0

Während dies eine gute Antwort ist, kann ich die Verwendung von einzelnen Buchstaben Variablennamen nicht ertragen, es sei denn, sie werden nur innerhalb der sehr engen Bereich einer for-Schleife oder Lambda-Ausdruck oder solche Dinge verwendet .Ziehen Sie in Betracht, Ihren Code zu bearbeiten, um Ihren Variablen sinnvolle Namen zu geben. Und es sind nicht nur die einzelnen Buchstaben. Wofür wird "count" verwendet? Sie müssen den zu erkennenden Code lesen und verstehen. Wenn Sie es "delimiterCount" genannt hätten, müssten Sie nicht den gesamten Code lesen, um es zu verstehen. –

+0

@ZoharPeled Stimmen Sie nicht über Variablennamen überein. Hat den Code bearbeitet, um ihn konsistenter zu machen. Ich empfehle Ihnen, https://codereview.stackexchange.com/ –

+0

zu überprüfen. Sie müssen mir nicht zustimmen; Das ist nur meine Meinung. Es basiert jedoch auf Erfahrung (meins und andere) - Je besser der Code lesbar ist, desto einfacher ist es, ihn aufrechtzuerhalten. Nur für die Kicks, komm zurück zu diesem Post in einem Jahr und überprüfe, wie viel Zeit und Mühe es braucht, um zu verstehen, was du hier geschrieben hast. Ich garantiere, dass es einfacher wäre, wenn Sie aussagekräftige Namen verwenden würden. Übrigens, es sei denn, Sie tun dies in einer engen Schleife, der Leistungsunterschied zwischen Teilen und Ihrem Code ist völlig vernachlässigbar - und es lohnt sich kaum, die 'FindByScanning'-Methode überhaupt zu schreiben. –

Verwandte Themen