2017-01-22 1 views
1

Ich habe Schwierigkeiten, herauszufinden, wie Sie mit Regex zusätzliche Buchstaben entfernen können.Entfernen von zusätzlichen Briefsätzen in einer inkonsistenten Textdatei mit Regex

Ich habe dieses Beispiel unten, das sagt, dass es 42 von "|" (vertikale Balken) pro Zeile.

|V.7|42| 
1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0| 
1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0| 
2|543|2|58|4|4|366|26|9|100||2|200||8|3|1000|49|20|430|17|6|10|21|54|2400|36||30|20|20|20|20|543|150|61028|2|100|1|2|2|0| 
3|1230|3|60|5|5|390|26|10|100||3|1500||10|3|1000|49|20|430|17|6|10|32|123|4800|46||30|20|20|20|20|1230|200|61028|3|1000|2|3|3|0| 
4|2002|4|61|6|6|424|27|12|100||4|6000||12|4|769|37|15|315|12|4|10|45|200|9600|57||30|20|20|20|20|2002|250|61028|4|5000|3|4|4|0| 
5|3306|5|63|7|7|468|29|14|100||5|18000||16|4|556|27|11|208|8|2|10|58|331||69||30|20|20|20|20|3306|300|61027|1|10000|4|5|5|0| 
6|4950|6|66|8|8|522|31|17|100||6|||18|4|435|21|9|147|6|1|10|74|495||80||30|20|20|20|20|4950|350|61027|2|30000|5|6|6|0| 
7|6947|7|69|10|10|585|33|20|100||7|||20|4|333|17|7|97|4|1|10|90|695||92||20|15|15|15|15|6947|400|61027|3|50000|6|7|7|0| 
8|9309|8|73|12|12|658|35|24|100||8|||24|4|286|14|6|73|3|1|10|109|931||105||20|15|15|15|15|9309|450|61026|1|100000|7|8|8|0| 
9|12050|9|77|14|14|741|38|28|100||9|||27|5|250|13|5|55|3|1|10|129|1205||117||20|15|15|15|15|12050|500|61026|2|300000|8|9|9|0| 
10|15183|10|82|16|16|834|41|33|100|100|10|||29|5|222|11|4|0|0|0|10|151|1366||130|5|20|15|15|15|15|15183|550|61025|1|500000|9|10|10|0| 
11|18720|11|87|19|19|936|45|38|100|100|11|||31|5|200|10|4|0|0|0|11|176|1685||143|10|20|15|15|15|15|18720|600|||||||0| 
12|21335|12|92|22|22|1048|48|44|100|100|12|||36|5|182|9|4|0|0|0|12|203|2134||157|15|10|15|10|10|10|21335|650|||||||0| 

Jetzt habe ich ein weiteres mit 45, was ich will, ist die neuen Buchstaben zu entfernen, so dass es genau 42 vertikale Balken wie oben hat.

|V.8|45| 
1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0|5000|40022|1| 
2|543|2|58|4|4|366|26|9|100||2|200||8|3|1000|49|20|430|17|6|10|21|54|2400|36||30|20|20|20|20|543|150|61028|2|100|1|2|2|0|25000|61034|1| 
3|1230|3|60|5|5|390|26|10|100||3|1500||10|3|1000|49|20|430|17|6|10|32|123|4800|46||30|20|20|20|20|1230|200|61028|3|1000|2|3|3|0|75000|40250|1| 
4|2002|4|61|6|6|424|27|12|100||4|6000||12|4|769|37|15|315|12|4|10|45|200|9600|57||30|20|20|20|20|2002|250|61028|4|5000|3|4|4|0|160000|61035|1| 
5|3306|5|63|7|7|468|29|14|100||5|18000||16|4|556|27|11|208|8|2|10|58|331||69||30|20|20|20|20|3306|300|61027|1|10000|4|5|5|0|300000|40355|3| 
6|4950|6|66|8|8|522|31|17|100||6|||18|4|435|21|9|147|6|1|10|74|495||80||30|20|20|20|20|4950|350|61027|2|30000|5|6|6|0|||| 
7|6947|7|69|10|10|585|33|20|100||7|||20|4|333|17|7|97|4|1|10|90|695||92||20|15|15|15|15|6947|400|61027|3|50000|6|7|7|0|||| 
8|9309|8|73|12|12|658|35|24|100||8|||24|4|286|14|6|73|3|1|10|109|931||105||20|15|15|15|15|9309|450|61026|1|100000|7|8|8|0|||| 
9|12050|9|77|14|14|741|38|28|100||9|||27|5|250|13|5|55|3|1|10|129|1205||117||20|15|15|15|15|12050|500|61026|2|300000|8|9|9|0|||| 
10|15183|10|82|16|16|834|41|33|100|100|10|||29|5|222|11|4|0|0|0|10|151|1366||130|5|20|15|15|15|15|15183|550|61025|1|500000|9|10|10|0|||| 
11|18720|11|87|19|19|936|45|38|100|100|11|||31|5|200|10|4|0|0|0|11|176|1685||143|10|20|15|15|15|15|18720|600|||||||0|||| 
12|21335|12|92|22|22|1048|48|44|100|100|12|||36|5|182|9|4|0|0|0|12|203|2134||157|15|10|15|10|10|10|21335|650|||||||0|||| 

Und ich habe diesen Code im Moment:

public string Fix(string FileName, int columnsCount) 
{ 
    var InputFile = File.ReadLines(FileName).Skip(1).ToArray(); 
    string Result = ""; 
    for(int i = 0; i < InputFile.Length; i++) 
    { 
     int FoundMatches = Regex.Matches(Regex.Escape(InputFile[i]), FindWhatTxtBox.Text).Count; 
     // If too many letters found, trim the rest. 
     if(FoundMatches > CountTxtBox.Text.Length) 
     { 
      string CurrentLine = InputFile[i]; 
     } 
    } 
    return Result; 
} 

Wie Sie jede Zeile hat entweder eine innerhalb seiner vertikalen Balken auf keine Zahlen sehen können. Wie kann ich die zusätzlichen Buchstaben entfernen?

+0

Sie keine Schleife benötigen sollten. Sie können etwas wie "^ ((?: \ D * \ |) {42}). * 'Durch" $ 1 "ersetzen. – phatfingers

+0

Vielen Dank für Ihre Antwort, phatfingers.Was würde ein Beispiel-Code dafür aussehen? – Eperty123

+0

Microsoft hat hier einen anständigen Beispielcode https://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110).aspx – phatfingers

Antwort

1

Müssen Sie eine RegEx verwenden?

using System; 
using System.Linq; 

public class Program 
{ 
    public static void Main() 
    { 
     string s = "1|0|1|58|4|4|351|25|8|||1|0||6|3|1000|49|20|430|17|6|0|10|0|1200|25||30|20|20|20|20|0|100|61028|1|0|0|1|1|0|5000|40022|1|"; 
     var arr = s.Split('|') ;    
     var retVal = String.Join("|", arr.Take(43)); 

     Console.WriteLine(retVal); 
    } 
} 

Es dauert 43, weil die 1. Stelle scheint einen Zähler zu mir ... Aber man kann es 42 natürlich machen: Es kann auch mit String-Manipulation wie dies getan werden. Beachten Sie, dass dieser Code fehlschlägt, wenn weniger als 43 Einträge vorhanden sind.

0

Zu einfach Regex zu verwenden. Siehe Code unten:

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string INPUT_FILENAME = @"c:\temp\test.txt"; 
     const string OUTPUT_FILENAME = @"c:\temp\test1.txt"; 
     static void Main(string[] args) 
     { 
      StreamReader reader = new StreamReader(INPUT_FILENAME); 
      StreamWriter writer = new StreamWriter(OUTPUT_FILENAME); 
      string inputLine = ""; 
      int lineCount = 0; 
      while ((inputLine = reader.ReadLine()) != null) 
      { 
       if (++lineCount == 1) 
       { 
        writer.WriteLine(inputLine); 
       } 
       else 
       { 
        string[] inputArray = inputLine.Split(new char[] {'|'}); 
        writer.WriteLine(string.Join("|", inputArray.Take(43))); 
       } 
      } 
      reader.Close(); 
      writer.Flush(); 
      writer.Close(); 
     } 
    } 
} 
+0

Dies half mir Tonnen! Vielen Dank jdweng! Vielen Dank für Ihre Hilfe Ich habe das gewählt, da dies die Dinge viel vereinfacht hat. Ich habe schon eine Weile nicht programmiert und habe Regex nicht studiert, und das ist so, dass ich relativ neu dafür bin. Nochmals vielen Dank! – Eperty123

0

Hier ist eine Datendatei, lassen Sie uns es einfach halten, indem Sie nur 5 Elemente, aber immer noch mit Regex. Halten Sie Ihre Beispiele klein für StackOverflow ... man wird mehr Antworten bekommen.

Der Code unten kann bis 42 ({0,42}) oder eine beliebige Anzahl je nach Bedarf geändert werden, aber das Beispiel wird dann schreiben nur 5.

Data File

1|2|3|4|5|6|7|8|9|10 
10|9|8|7|6|5|4|3|2|1|0|1| 
||||||||||||11|12| 

-Code lesen Um 0 bis 5 Artikel pro Zeile zu erhalten

var data = File.ReadAllText(@"C:\Temp\test.txt"); 

string pattern = @"^(\d*\|){0,5}"; 

File.WriteAllLines(@"C:\Temp\testOut.txt", 
        Regex.Matches(data, pattern, RegexOptions.Multiline) 
         .OfType<Match>() 
         .Select(mt => mt.Groups[0].Value)); 

Resultierende Datei

1|2|3|4|5| 
10|9|8|7|6| 
||||| 
Verwandte Themen