2012-04-13 29 views
-1

私はcsvファイルから読み込み、ファイルの各要素を文字列の配列に格納するコンソールアプリケーションを作成しています。私は、配列内の各文字列を繰り返し、非アルファベット文字と空白をすべて削除する方法があります。私はregex.replace()を使って文字列を使ってこれを成功させましたが、文字列の配列でそれをやろうとすると変更されました。その後、string.replace()を使用しようとしましたが、無駄にしました。私は正規表現のパスがより良い選択肢だと思うが、私は成功していない。もし誰かが私を助けることができたら、私はそれを高く評価します。これまでのコードは、これまで通りです。文字列置換()/ regex replace - 文字列の配列の文字列を置換しますか?

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); 
    } 

csvファイルには、カンマで区切って異なるアドレスが含まれています。私の目標は数字を削除し、通りの名前だけを残すことです。例えば、元の文字列は123の偽であり、目標は "123"を削除して "偽"に置き換えることです。私は配列の各要素にこれをしたい。

+0

[Regex.ReplaceのMSDNページ](http://msdn.microsoft.com/en-us/library/h0y2x3xs.aspx)を読んでいますか? (A)は文字列を返し、(B)は最初の引数として整数を取らないので、これはそのままコンパイルされません。 –

+0

実際のコードがこのサンプルと多少異なる場合を除いて、アドレス配列内のファイルから最後のアドレスだけを取得しています。 whileループの各繰り返しで上書きします。 – pstrjds

答えて

2

交換するときに何かをする必要があります。次のような問題が修正されます。

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; 
} 

ここで重要なのは、あなたがRegEx.Replaceに値を渡し、またあなたの配列を更新しなければならないということです。

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(','); 
} 

...とFile.ReadAllLinesに置き換えることができます:ミッチェルの答えに加えて

+0

うわー。私はそれが何か単純な感じだった。どうもありがとうございました! – mpcc12

1

が、これは問題である

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

あなたはFile.ReadLinesを使用して、その場でアドレスを修正することができます:

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

これを追加したときにコメントとして追加していました。私はReadAllLinesを考えていましたが、それ以外のパスを分割する必要はありません。 'List 'を使用し、ストリームリーダーを保持し、スプリットラインをリストに追加する方が良いかもしれません。 – pstrjds

+0

@pstrjds:あなたは正しいですが、OPはすでに2回のパスを取っています(読み込んだ後、 'ChangeAddress'を呼び出します) –

0

正規表現の置き換えを適用しない理由それをあなたのアドレス配列に入れる前にstrLineするのはどうですか?あなたは、次のような何かができる:

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

は、あなたはおそらく削除「」sのと同様ではないためにあなたの正規表現を変更したいと思います。