2012-04-20 11 views
1

文字列をテキストファイルから配列に分割してクラスに格納できるようにしようとしていますが、動作していません。それはそれはtextfile.txtで同じフォーマットを返し、それを分割しない文字列が配列に分割されていない

using (StreamReader reader = new StreamReader("textfile.txt")) 
{ 
    string line; 
    while ((line = reader.ReadLine()) != null) 
    { 
    char[] delimiters = new char[] { '\t' }; 
    string[] parts = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries); 
    for (int i = 0; i < parts.Length; i++) 
    { 
     MessageBox.Show(parts[i]); 
    } 

    } 
} 

テキストファイルが含まれています

George\t15\tStudent\tAddress\tB:\temp\profilepic.png 

が、私はそれが(分割後)のようになりたい:

George 
15 
Student 
Address 
profilepic.png 

アイデアや助けがありがとうございます。

+0

を、あなたは実際にファイルに '\のT 'を参照するか、あなたはありますかテキスト表現のためにそこに置くだけですか? – Joe

+0

あなたは本当にあなたのテキストファイルに '\ t'のすべてを持っていますか?それとも、テキストファイルにタブが含まれていることを示す方法ですか? –

+0

ファイルには\ – UnknownUser

答えて

1

、私はあなたが得ることができると思う最も近いが、おそらく使用しています次の正規表現は、もしあなたがこれを使って遊ぶならば、パスを与えないようにすることもできますし、ループの中でパスをチェックしてスキップすることもできます。これはパスかどうかを伝えます。[a-zA-Z]:\\\w*?\\

string[] results = Regex.Split(line, @"(?<!B:)\\t|(?<=B:\\\w*?\\)"); 

このリストは、次のとおりです。

  • ジョージ
  • 学生
  • 住所
  • B:\ tempに
  • \ profilepic.png
+0

完璧に感謝します – UnknownUser

+0

私はそれをやろうとしました。 Regex.Split(cadena、@ "(?<![a-zA-Z]:)\\ t")は私が望んだものです – Blau

6

"\ t"は "タブ"を意味する特殊文字です。実際に文字列\tを検索する場合は、"\\t"または@"\t"を使用する必要があります。あなたはそれをchar配列にする必要もありません。文字列のオーバーロードがあります。

+1

があります。B:\ temp \ profilepic.pngにあるファイルは失敗します... – Blau

+2

確かに。ひどく形成されたフィードファイルです。 –

+0

私は悪い形成されていないと思う...あなたはそれが常に最後のフィールドであることを認識する必要があります.. – Blau

1

"\\t"を分割文字列として使用する必要があります。あなたが得る必要があります。
ジョージ
を学生
住所
B:
のempの\ profilepic.png

ない profilepic.png

EDIT:"\\t"は次のように表示されていました"\t"私の答え

+0

パスの "B:\ t"の部分に "B:"と "emp \ profilepic.png"と記入してください。 – payo

+0

@payo、wow nice catch – Habib

0

あなたがここにいる問題は、Escape Sequencesです。 '\'で始まる文字の組み合わせはエスケープシーケンスとみなされ、通常の文字列とは異なる動作をします。リンクの表からわかるように、 '\t'は水平タブを表します。したがって、C#では区切り文字として '\t'を使用すると、水平タブが検索されますが、平文には実際の文字列「\t」があります。

デリミタとして使用する場合、水平タブを検索すると「\t」と表示されるのはなぜですか?答えはリンクにも表示されます。 '\\'は '\'のように表現されています(それについて考えている場合は必要ですが、それ以外の場合はどうすれば '\(anything)'を見つけることができますか?)ので、区切り文字は '\\t'でなければなりません。指定されたサンプルラインを使用して

(あなたが文字配列にすべてを回さず、あまりにも文字列でこれを行うことができますことに注意してください、原理はまだ保持している)

+0

説明をありがとう。私は唯一の問題を抱えていますが、次のようなエラーメッセージが表示されます。エラー1文字リテラルの文字数が多すぎます。それをどうやって修正するのですか? – UnknownUser

+0

は今すぐ修正することができました。 – UnknownUser

+0

@UnknownUser '\\ t'が2文字で、1つの文字に収まらないために起こっています。あなたは文字区切り文字に文字区切り文字を変更する必要があります(あなたがそうするときにtempからtを失うという他のコメントに注意する必要があります) – NominSim

関連する問題