2012-04-13 24 views
-1

Ich schreibe eine Konsolenanwendung, die aus einer CSV-Datei liest und speichert jedes Element aus der Datei in einem Array von Zeichenfolgen. Es gibt eine Methode, mit der ich jede Zeichenfolge im Array durchlaufen und alle nicht alphanumerischen Zeichen und Leerzeichen entfernen möchte. Ich war erfolgreich mit einer Zeichenfolge mit einem regex.replace(), aber das änderte sich, sobald ich es mit einem Array von Zeichenfolgen versuchte. Ich ging dann weiter und versuchte, eine string.replace() zu verwenden, aber ohne Erfolg. Ich denke, der Regex-Pfad ist eine bessere Option, aber ich war nicht erfolgreich. Wenn mir jemand helfen könnte, würde ich das sehr schätzen. Hier ist mein Code so weit:String Replace()/regex replace - Ersetzen von Strings im String-Array?

public static string[] ChangeAddress(string[] address) 
    { 
     for (int i = 0; i < address.Length; i++) 
     { 
      Regex.Replace(i, @"(\s-|[^A-Za-z])", ""); 
      System.Console.WriteLine(address[i]); 
     } 
     return address; 
    } 

    static void Main(string[] args) 
    { 
     string[] address = null; 
     //try...catch read file, throws error if unable to read 
     //reads file and stores values in array 
     try 
     { 
      StreamReader sr = new StreamReader("test.csv"); 
      string strLine = ""; 
      //while not at the end of the file, add to array 
      while (!sr.EndOfStream) 
      { 
       strLine = sr.ReadLine(); 
       address = strLine.Split(','); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("File could no be read:"); 
      Console.WriteLine(e.Message); 
     } 

     //calls ChangeAddress method 
     ChangeAddress(address); 
    } 

Die CSV-Datei enthält verschiedene Adressen durch Kommas getrennt. Mein Ziel ist es, die Zahlen zu entfernen und nur mit dem Straßennamen zu bleiben. Zum Beispiel könnte die ursprüngliche Zeichenfolge 123 Fake sein, das Ziel ist es, die "123" zu entfernen, so dass sie nur durch "Fake" ersetzt werden würde. Ich möchte dies für jedes Element im Array tun.

+0

Haben Sie die [MSDN-Seite für Regex.Replace] (http://msdn.microsoft.com/en-us/library/h0y2x3xs.aspx) gelesen? (A) es _returnns_ eine Zeichenkette und (B) keine ganze Zahl als das erste Argument annimmt, so wird dies nicht so kompiliert wie es ist. –

+0

Wenn Ihr tatsächlicher Code nicht anders ist als dieses Beispiel, erhalten Sie nur die letzte Adresse aus der Datei in Ihrem Adressfeld. Sie überschreiben es in jeder Iteration Ihrer while-Schleife. – pstrjds

Antwort

2

Sie müssen etwas mit dem Ergebnis tun, wenn Sie ersetzen, etwas Ähnliches sollte das folgende beheben.

public static string[] ChangeAddress(string[] address) 
{ 
    for (int i = 0; i < address.Length; i++) 
    { 
     address[i] = Regex.Replace(address[i], @"(\s-|[^A-Za-z])", ""); 
     System.Console.WriteLine(address[i]); 
    } 
    return address; 
} 

Der Schlüssel hier ist, dass Sie den Wert in RegEx.Replace passieren müssen und auch Ihr Array aktualisieren.

+0

Wow. Ich hatte das Gefühl, dass es etwas Einfaches war. Vielen Dank! – mpcc12

1

Neben Mitchel Antwort, ist das ein Problem:

StreamReader sr = new StreamReader("test.csv"); 
string strLine = ""; 

//while not at the end of the file, add to array 
while (!sr.EndOfStream) 
{ 
    strLine = sr.ReadLine(); 
    address = strLine.Split(','); 
} 

... und kann mit File.ReadAllLines ersetzt:

addresses = File.ReadAllLines("test.csv"); 

Sie File.ReadLines und befestigen Sie die Adresse on the fly verwenden können :

var addresses = new List<string>(); 
foreach(var address in File.Readlines("test.csv")) 
{ 
    var corrected = Regex.Replace(address, @"(\s-|[^A-Za-z])", ""); 
    addresses.Add(corrected); 
} 
+0

Ich habe das nur als Kommentar hinzugefügt, als Sie das hinzugefügt haben. Ich habe an ReadAllLines gedacht, außer dass Sie einen weiteren Pass benötigen, um die Zeilen zu teilen. Es ist vielleicht besser (vielleicht), eine 'Liste ' zu verwenden und den Stream Reader beizubehalten und die Teilungslinien zur Liste hinzuzufügen. – pstrjds

+0

@pstrjds: Sie haben Recht, aber OP nimmt bereits zwei Durchgänge (Einlesen und später Aufruf von 'ChangeAddress') –

0

Warum nicht Ihren Regular Expression Replaceme anwenden nt zu strLine, bevor Sie es in Ihr Adressfeld einfügen? Sie könnten nur in etwa wie folgt tun:

 
`Regex.Replace(strLine, @"(\s-|[^A-Za-z])", "");` 
`address = strLine.Split(',');` 

Natürlich würden Sie wahrscheinlich wollen Ihre Regex ändern das nicht entfernen ‚‘ s auch.