0

C#には、いくつかのクールなクラスとトリック、およびショートカットがあります。私はこれを知っていますが、C#を使ってそれらを記憶させるのに十分な作業をしていません。

クールなトリックの1つはこれです。各行がタブで区切られた列に配置されている同様の行ごとの構造に配置されたファイルデータから読み取る場合、データをC#の一種のクラスに読み込んでから、1つを解析できます。 「foreach」コマンドを実行するだけでデータの列。誰かがこれがどのように行われるかを手元で知っていますか?

基本的に、私が話しているのはこれです。ファイルを1行ずつ読み取る方法を理解しています。

int counter = 0;
string line;
System.IO.StreamReader file =
   new System.IO.StreamReader(filename);

while ((line = file.ReadLine()) != null)
{
    Console.WriteLine(line);
    counter++;
}

file.Close();

Console.WriteLine(line);ここで、入力ファイルの行列が/ t(タブ)で区切られている場合、データをクラスのメンバーに自動的に編成するコードに置き換えるにはどうすればよいですか?

4

2 に答える 2

2

呼び出すことができますline.Split('\t')これはあなたにstring[]配列を与えます。次に、各要素を適切なデータ型に解析できます。

MyData LineToMyData(string line)
{
    try
    {
        string[] arr = line.Split('\t');

        return new MyData()
        {
            Time = DateTime.Parse(arr[0]),
            Name = arr[1],
            Age = Int32.Parse(arr[2])
        };
    }
    catch (Exception ex)
    {
        throw new ArgumentException("line", ex);
    }
}
于 2012-08-13T19:02:04.727 に答える
0

さて、私はあなたがクラスを必要とすると思います:

public class Stuff
{
    public string field1 {get; set;}
    public string field2 {get; set;}
    public string fieldn {get; set;}
    public Stuff()
    {
        field1 = "";
        field2 = "";
        fieldn = "";
    }
}

次に、While-> readの前に、新しいクラスのリストを作成します。while-> read内でクラスを作成し、上記のようにsplitを使用してデータを入力します。

List<Stuff> lotsaStuff = new List<Stuff>();        
while ((line = file.ReadLine()) != null)         
{         
    string[] fields = line.Split('\t');
    Stuff newStuff = new Stuff();
    newStuff.field1 = fields[0].ToString();
    newStuff.field2 = fields[1].ToString();;
    newStuff.fieldn = fields[2].ToString();;
    lotsaStuff.Add(newStuff);         
}

ファイルを閉じた後、リストを使用できます。

foreach (Stuff mystuff in lotsaStuff)
{
    if (mystuff.field2 == "useME")
    {
        //do something here...
    }
}

クラス内と、読み取った行からクラスに入力するときの両方で、データ型(簡単にするためにすべての文字列を使用)をデータに一致させる必要があります。

于 2012-08-13T19:33:22.253 に答える