2016-07-07 13 views
1

Ich habe eine Textdatei mit vielen Zeilen, jede Zeile sieht so aus: "string string double double" zwischen jedem Wert ist ein Leerzeichen. Ich möchte die erste Zeichenfolge und das letzte Doppel jeder Zeile auslesen und diese beiden Werte in eine vorhandene Liste einfügen. Das ist mein Code bisher, aber es funktioniert nicht wirklich.Lesen Sie bestimmte Werte aus einer Textdatei und fügen Sie sie in eine Liste ein

private void bOpen_Click(object sender, RoutedEventArgs e) 
    { 
     bool exists = File.Exists(@"C:\Users\p2\Desktop\Liste.txt"); 

     if (exists == true) 
     { 
      StringBuilder sb = new StringBuilder(); 

      using (StreamReader sr = new StreamReader(@"C:\Users\p2\Desktop\Liste.txt")) 
      { 
       Vgl comp = new Vgl(); 
       comp.name = Abzahlungsdarlehenrechner.zgName; 
       comp.gErg = Abzahlungsdarlehenrechner.zgErg; 

       GlobaleDaten.VglDaten.Add(comp); 


       int i = 0; 
       string line = File.ReadLines(@"Liste.txt").Skip(0).Take(1).First(); 
       while ((line = sr.ReadLine()) != null) 
       { 
        sb.Append((line)); 
        listBox.Items.Add(line); 
        GlobaleDaten.VglDaten.Add(comp); 

        i++; 
       } 
      } 
     } 

Ich habe dies schon gelesen, aber es hat nicht How do I read specific value[...]

+0

Sie brauchen also das erste und das letzte Wort? oder die ersten "string" und letzten "doppelten" exakten Wörter? – user3185569

+0

@ user3185569 der Wert von jedem. Beispiel: Name 500 –

+0

Wie beabsichtigen Sie, die Werte in die Liste aufzunehmen? als eine durch ein Leerzeichen getrennte Zeichenkette? –

Antwort

1

Sie verwenden können:

string[] splitBySpace = line.Split(' '); 

string first = splitBySpace.ElementAt(0); 
decimal last = Convert.ToDecimal(splitBySpace.ElementAt(splitBySpace.Length - 1)); 

Edit: Um Währungssymbol Griff:

string[] splitBySpace = line.Split(' '); 
string pattern = @"[^0-9\.\,]+"; 

string first = splitBySpace.ElementAt(0); 
string last = (new Regex(pattern)).Split(splitBySpace.ElementAt(splitBySpace.Length - 1)) 
            .FirstOrDefault(); 

decimal lastDecimal; 
bool success = decimal.TryParse(last, out lastDecimal); 
+0

sollte es in die While-Schleife meines Codes gesetzt haben? Ursache, wenn ich nicht einige Fehler zeige –

+0

@SebDammer Es sollte innerhalb der while '((line = sr.ReadLine())! = null) {}' in Ihrem Code sein. – user3185569

+0

Es scheint zu funktionieren. Aber ich werde etwas von meinem Code ein bisschen umschreiben müssen. Ich muss die Werte in eine Liste für eine Vergleichsmethode in einer anderen Klasse einfügen. Ihre Methode scheint einige Probleme mit den € -Signs zu haben, genau wie Fubos Methode. –

2

wie etwa

List<Vgl> Result = File.ReadLines(@"C:\Users\p2\Desktop\Liste.txt") 
      .Select(x => new Vgl() 
      { 
       name = x.Split(' ').First(), 
       gErg = decimal.Parse(x.Split(' ').Last(), NumberStyles.AllowCurrencySymbol) 
      }) 
      .ToList(); 

ich Geld innerhalb doulbe Werte speichern würde vermeiden helfen, da dies zu Rundungsproblemen führen könnte. Verwenden Sie stattdessen decimal. Beispiele hier: Is a double really unsuitable for money?

+0

@SebDammer können Sie 'NumberStyles.AllowCurrencySymbol' verwenden, um Ausnahmen mit Währungssymbolen wie € zu vermeiden - meine Antwort wurde aktualisiert – fubo

+0

Ich wusste das nicht, danke für den Hinweis :) Aber plötzlich zeigt es immer einen Fehler, egal welchen Code ich benutze . Dmitry Bychenkos Code zum Beispiel arbeitete fließend. "System.FormatException" nochmal ... –

+0

ok das ist schwer zu sagen ohne die Datei zu kennen. Ein Leerzeichen innerhalb der Zeichenfolge oder ein '' '' anstelle von ''.'als Separator könnte der Grund sein. – fubo

2

können Sie versuchen, Linq:

var source = File 
    .ReadLines(@"C:\Users\p2\Desktop\Liste.txt") 
    .Select(line => line.Split(' ')) 
    .Select(items => new Vgl() { 
     name = items[0], 
     gErg = double.Parse(items[3]) 
    }); 

// If you want to add into existing list 
GlobaleDaten.VglDaten.AddRange(source); 

// If you want to create a new list 
//List<Vgl> list = source.ToList(); 
+0

Funktioniert perfekt, sogar mit meiner Vergleichsmethode. Vielen Dank! :) –

0

Verwendung String. split mit Leerzeichen als Trennzeichen in der Zeile zum String i nto ein Array mit jedem Wert. Dann greife einfach auf das erste und letzte Array-Element zu. Wenn Sie nicht absolut sicher sind, dass jede Zeile genau 4 Werte enthält, sollten Sie natürlich die Länge des Arrays überprüfen, um sicherzustellen, dass es mindestens 4 Werte gibt.

Referenz Split auf mit: https://msdn.microsoft.com/en-us/library/ms228388.aspx

1

ich mit @Dmitry und fubo zustimmen, wenn Sie nach Alternativen suchen, könnten Sie dies versuchen.

var source = File 
    .ReadLines(@"C:\Users\p2\Desktop\Liste.txt") 
    .Select(line => 
    { 
     var splits = line.Split(' ')); 
     return new Vgl() 
       { 
        name = splits[0], 
       gErg = double.Parse(splits[3]) 
       }; 
    } 
0
  1. die gesamte Datei als String lesen.
  2. Teilen Sie die Zeichenfolge in einer foreach-Schleife mit \ r \ n als Zeilentrennzeichen. Fügen Sie jede Zeile zu einer Liste von Zeichenfolgen hinzu.
  3. Iterieren Sie durch diese Liste und teilen Sie jeden Datensatz in einer anderen Schleife erneut mit Leerzeichen als Feldtrennzeichen und fügen Sie sie in eine andere Liste von Zeichenfolgen.
  4. Jetzt haben Sie alle vier Felder mit einer Zeile. Verwenden Sie jetzt nur die Methoden First und Last, um das erste Wort und die letzte Nummer zu erhalten.
Verwandte Themen