2017-03-14 1 views
0

Ich frage die Frage nach dem Kontext der Anologie lässt sagen, ich habe verschiedene Formen von Daten und ich möchte sie in einem Format konvertieren. Ich habe dasWie ändere ich verschiedene Format von Text in ein Format in C#

string[] dates = 
          { 
       "december-21-2016", 
       "december, 28,2016", 
       "27 january,2017", 
       "29 december,2016", 
       "03 mar 1990" 

          }; 
     string[] formattedDates = new string[dates.Length]; 

     string[] formats = { "MMMM-dd-yyyy","MMMM, dd,yyyy","MMMM, d,yyyy","dd MMMM,yyyy","dd MMM yyyy" }; 
     for (int i = 0; i < dates.Length; i++) 
     { 
      DateTime date; 
      if (DateTime.TryParseExact(dates[i], formats, CultureInfo.InvariantCulture, DateTimeStyles.None, out date)) 
       formattedDates[i] = date.ToString("dd/MM/yyyy"); 
      Console.WriteLine(formattedDates[i]); 
     } 

hier unten Code unter Verwendung der Ausgang 21-12-2016, 28-12-2016, 27-01-2017, 29-12-2016, 03-03 -1990,

ich mag den gleichen Code schreiben, aber für Text anstelle von Daten wie

string[] formats= 
      { 
      "Husband and Wife", 
      "Wife and Husband", 
      "Husband and Wife", 
      "Wife and Husband", 
      "hus & wife", 
      "H & W",    
      }; 

aber die Ausgabe sollte dort oben „H und W“, für alle Format sein. Es wird noch toller, wenn wir das mit linq machen können.

Entschuldigung für schlecht Englisch & Formatierung, ich bin neu zu diesem.

+0

Es sollte möglich sein, aber es hat nichts mit 'DateTime' Analyse zu tun. – Sinatr

+0

Folgen Sie einfach der gleichen Logik wie Ihr Datetime-Code. Gehe durch "formats" und überprüfe jede Zeichenkette nach den Wörtern * man * und * wife * und füge dann "H und W" zu deiner Ausgabe hinzu. – maccettura

+0

Erfüllt "Hard Worker" Ihre Anforderung - wenn nicht - warum? Bitte entfernen Sie nicht relevante und nicht zu verstehende Datasparing-Beispiele und definieren Sie stattdessen klare Regeln und Code, den Sie bereits versucht haben, das Problem zu lösen. –

Antwort

0

Während DateTime eine etwas einfache Möglichkeit bietet, sie basierend auf dem Format zu analysieren, sind andere Textformen möglicherweise schwieriger zu handhaben.

Ich bin nicht sicher, Regex ist am besten geeignet, in einem solchen Szenario jedoch Sie sich von dem folgenden Code, um inspirieren können Ihren Textanalyse zu erreichen:

public class RegexTextCalibrator 
{ 
    private ICollection<Tuple<Regex, string>> Calibrations = new List<Tuple<Regex, string>>(); 

    public void AddParallelPattern(IEnumerable<string> a, IEnumerable<string> b, string output) 
    { 
     this.AddParallelPattern(a, b, @"\W+.*", output); 
    } 

    public void AddParallelPattern(IEnumerable<string> a, IEnumerable<string> b, string inBetweenLinkPattern, string output) 
    { 
     string subPatternA = String.Join("|", a); 
     string subPatternB = String.Join("|", b); 

     var patternA = String.Format("({0})({1})({2})", subPatternA, inBetweenLinkPattern, subPatternB); 
     var patternB = String.Format("({0})({1})({2})", subPatternB, inBetweenLinkPattern, subPatternA); 

     this.Add(String.Format("{0}|{1}", patternA, patternB), output); 
    } 

    public void Add(string pattern, string output) 
    { 
     this.Add(new Regex(pattern, RegexOptions.IgnoreCase), output); 
    } 

    public void Add(Regex regex, string output) 
    { 
     Calibrations.Add(new Tuple<Regex, string>(regex, output)); 
    } 

    public string Resolve(string value) 
    { 
     var calibration = this.Calibrations.FirstOrDefault(x => x.Item1.IsMatch(value)); 
     return calibration != null ? calibration.Item2 : null; 
    } 
} 

bearbeiten Unten ist die kommentierte Verwendung des obigen Codes.

können Sie die Klasse wie folgt verwenden:

// configure the calibration/mapping. 
var calibrator = new RegexTextCalibrator(); 
calibrator.AddParallelPattern(
       new[] { "husband", "hus", "h" }, // defines one side of the pattern 
       new[] { "wife", "w" }, // defines the other side of the pattern 
       "H and W"); // defines the result 

// the inputs that will be mapped 
var inputs = new string[] { 
    "Husband and Wife", 
    "Wife and Husband", 
    "Husband and Wife", 
    "Wife and Husband", 
    "hus & wife", 
    "H & W" 
}; 

// loops through the inputs and map them to the desired value 
foreach (var input in inputs) 
    Console.WriteLine(calibrator.Resolve(input)); // prints "H and W"... 
+0

Danke für deine Hilfe Mann, aber es ist nicht was ich will, vielleicht habe ich es nicht verstanden. Meine Anforderung ist, dass ich diese Eingaben habe: "Hus & Frau", "Frau & Hus", "Mann und Frau", "H & W". Ich möchte diesen Ausgang für alle Eingänge "H und W". – user3882060

+0

@ user3882060 Wenn ich gut verstanden habe, sollte die Bearbeitung Ihnen zeigen, wie Sie diese Methode verwenden. – StfBln

Verwandte Themen