2017-01-09 2 views
-1

Ich habe eine mehrzeilige Zeichenfolge, die ich von einer Datenbank bekomme. Diese Saite würde ein Format wie haben:C# Suche mehrzeilige Zeichenfolge für Schlüsselwort und speichern Variablen

The below text is for the label program 

COMPANY=ComanyName 
PRODUCT=ProductName 
SERIALMASK=123456789YYWWXXXX 

Wie gehe ich durch diesen Text und speichern Variablen oder ein Array mit ComanyName, ProductName, 123456789YYWWXXXX, so kann ich diese Werte in Textboxen auf meinem Windows Forms Application einfügen?

Meine große Hürde ist, dass manchmal das Format wäre:

The below text is for the label program 

Company1 Information: 
COMPANY=ComanyName 
PRODUCT=ProductName 
SERIALMASK=123456789YYWWXXXX 

Company2 Information: 
COMPANY=ComanyName 
PRODUCT=ProductName 
SERIALMASK=123456789YYWWXXXX 

Und in diesem Fall, ich will nur extrahieren Sie die ersten Vorkommen von COMPANY, PRODUCT und SERIALMASK Variablen.

Jetzt habe ich Code, der jede Zeile in einer Variablen speichert, und ich denke, ich könnte eine Switch-Case-Funktion in der Foreach-Schleife ausführen und nach Teilzeichenfolge suchen. Aber ich hoffe, es ist ein effektiver Weg

Antwort

1

Try Code unten

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string input = 
       "COMPANY=ComanyName\n" + 
       "PRODUCT=ProductName\n" + 
       "SERIALMASK=123456789YYWWXXXX\n"; 

      string pattern = @"(?'name'\w+)=(?'value'\w+)"; 

      MatchCollection matches = Regex.Matches(input,pattern); 

      foreach(Match match in matches) 
      { 
       Console.WriteLine("Name : '{0}', Value : '{1}'", match.Groups["name"].Value, match.Groups["value"].Value); 
      } 
      Console.ReadLine(); 

      Dictionary<string, string> dict = matches.Cast<Match>() 
       .GroupBy(x => x.Groups["name"].Value, y => y.Groups["value"].Value) 
       .ToDictionary(x => x.Key, y => y.FirstOrDefault()); 
     } 
    } 
} 
+0

Brilliant für das Format der Zeile suchen reguläre Ausdrücke zu verwenden. :) Das funktioniert wunderbar. Ich habe eine 'foreach (var Eintrag in dict) {}' mit einem 'switch-case' gemacht, um nach dem Schlüssel zu suchen, den ich brauche, um die Werte in Textfelder einzugeben. Und alles funktioniert wie es sollte. Aber ich habe mich gefragt. Gibt es eine Möglichkeit, die Werte wie folgt zu extrahieren: 'textBox.Text = dict-where-key = COMPANY.Value' :) Oder ist mein Weg genauso effizient? –

+0

Aufzählen auf den Schlüsseln: string v = dict.AsEnumerable(). Wobei (x => x.Wert == "ProductName"). Wählen Sie (x => x.Key) .FirstOrDefault(); – jdweng

+0

Danke jdweng. Großartige Idee. Arbeitete perfekt, mit einer kleinen Korrektur. 'string v = dict.AsEnumerable() .Wobei (x => x.Key ==" PRODUKT ") Wählen Sie (x => x.Wert) .FirstOrDefault();' Vielen Dank für Ihre Hilfe. –

1

Dies könnte den Trick für Sie tun

string allText = File.ReadAllText("JsonFound.txt"); 
List<string> allrecord = allText.Split(new string[] { "\r\n\r\n" }, StringSplitOptions.RemoveEmptyEntries) 
           .Where(x => x.Contains(":")) 
           .ToList(); 
List<CompanyInfo> CompanyInfos = new List<CompanyInfo>(); 
List<string> infos = new List<string>(); 
foreach(string s in allrecord) 
{ 
    infos = s.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries) 
      .Skip(Math.Max(0, 1)) 
         .SelectMany(q=>q.Split('=')) 
      .ToList(); 

    CompanyInfo ci = new CompanyInfo(); 
    ci.CompanyName = infos[1]; 
    ci.ProductName = infos[3]; 
    ci.SerialMaskNumber = infos[5]; 
    CompanyInfos.Add(ci); 
} 

der Klasse CompanyInfo wie diese

public class CompanyInfo 
{ 
    public string CompanyName 
    { 
     get; 
     set; 
    } 
    public string ProductName 
    { 
     get; 
     set; 
    } 
    public string SerialMaskNumber 
    { 
     get; 
     set; 
    } 
} 
aussehen würde
+0

Vielen Dank für Ihren Beitrag. Es sieht nach einer guten Lösung aus, wenn ich darauf vertrauen könnte, dass die Informationen in genau der gleichen Reihenfolge gespeichert werden, mit CompanyName, ProductName und SerialMaskNumber. Aber wenn jemand die Information in einer anderen Reihenfolge eingibt, würde ich mit dieser Lösung die falsche Information bekommen. –

0

können Sie die HashSet-Funktion verwenden. Die Liste enthält keine doppelten Datensätze.

var hashSet = new HashSet<CompanyInfo>(CompanyInfos); 
Verwandte Themen