0

次のようなテキスト ファイルがあります。

DeltaV User List - 17 Jun 2013
SUPPLY_CHAIN


UserID              Full Name
BAINC               C M B
BEEMANH             H B
CERIOJI             J M C
LADUCK              K L
MAYC                C M
NEWTONC             C N

DeltaV User List - 17 Jun 2013
FERM_OPER


UserID              Full Name
POULIOTM            M P
TURNERM7            M T

C# でこれらのセクションごとに個々のユーザーを取得する必要がありますが、その方法がわかりません。私は StreamReader クラスを使用していましたが、エリア名 (すべて大文字の単語) を取得するために機能しましたが、すべてのユーザーを取得できないようです。名前と領域の 2 つの文字列を持つユーザー クラスがあり、ユーザー オブジェクトのリストを作成しようとしています。

これは私がこれまでに試したことです: (コードの前半で User オブジェクトのリストを宣言しました)

        // read user list text file
        var userReader = new StreamReader(File.OpenRead(UserListPath));

        while(!userReader.EndOfStream)
        {
            var line = userReader.ReadLine();
            var newUser = new User();
            if(line.Contains("DeltaV User List"))
            {
                var Area = userReader.ReadLine();
                newUser.Area = Area;
                userReader.ReadLine();
                userReader.ReadLine();
                userReader.ReadLine();

                var userid = userReader.ReadLine();
                Console.WriteLine(userid);
                var name = userid.Split(' ');
                Console.WriteLine(name[0]);
                newUser.UserId = name[0];
            }
            Users.Add(newUser);
        }

ああ、フルネームではなく、UserId だけを取得する必要があります。

4

3 に答える 3

1
    // read user list text file
    var userReader = new StreamReader(File.OpenRead(UserListPath));
    var Area = "";
    while(!userReader.EndOfStream)
    {
        var line = userReader.ReadLine();
        if(line.Contains("DeltaV User List"))
        {
            Area = userReader.ReadLine();  // Area applies to group of users below.
            userReader.ReadLine(); // blank line
            userReader.ReadLine(); // blank line
            userReader.ReadLine(); // User ID header line
        }
        else
        {
            if (line.trim() != "") // Could be blank line before "DeltaV..." 
            {
                var userid = line;
                var newUser = new User();
                newUser.Area = Area;
                // I left the following lines in place so that you can test the results.
                Console.WriteLine(userid);
                var name = userid.Split(' ');
                Console.WriteLine(name[0]);
                newUser.UserId = name[0];
                Users.Add(newUser);
            }
        }
    }
于 2013-10-23T00:15:20.770 に答える
1

編集済み

必要なものを実現する小さなコードを次に示します。

        using (var fileStream = File.OpenRead(UserListPath))
        using (var userReader = new StreamReader(fileStream))
        {
            string currentArea = string.Empty;
            string currentToken = string.Empty;
            while (!userReader.EndOfStream)
            {
                var line = userReader.ReadLine();
                if (!string.IsNullOrEmpty(line))
                {
                    var tokenFound = Tokens.FirstOrDefault(x => line.StartsWith(x));
                    if (string.IsNullOrEmpty(tokenFound))
                    {
                        switch (currentToken)
                        {
                            case AreaToken:
                                currentArea = line.Trim();
                                break;
                            case UserToken:
                                var array = line.Split(' ');
                                if (array.Length > 0)
                                {
                                    Users.Add(new User()
                                    { 
                                        Name = array[0],
                                        Area = currentArea
                                    });
                                }
                                break;
                            default:
                                break;
                        }
                    }
                    else
                    {
                        currentToken = tokenFound;
                    }
                }
            }
        }

このプログラムは、入力ファイルが改行で終わっていることを前提としています。これらの定数を使用して、アクセサーを変更することにより、クラスまたは必要な場所で宣言する必要があります(privateたとえばpublicに):

private const string AreaToken = "DeltaV";
private const string UserToken = "UserID";

private List<string> Tokens = new List<string>() { AreaToken, UserToken };

もちろん、私は自分のやり方でやったので、おそらくもっと良い方法がたくさんあるでしょう。必要に応じて改善してください。これは、コンパイルして動作するドラフトのようなものです。

とりわけ、次のことがわかります。

  • usingキーワードの使用。これは、メモリ/リソース/ファイル ハンドルが適切に解放されていることを確認するのに非常に役立ちます。
  • ハードコードされた値の使用を避けようとしました (これが、定数と参照リストを使用する理由です)
  • Tokens新しい定数をトークン参照リスト (と呼ばれる) に追加し、スイッチ ケースを拡張して新しいファイル トークン/シナリオを処理するだけでよいように作成しようとしました

最後に、リストをインスタンス化することを忘れないでくださいUser:

List<User> Users = new List<User>();
于 2013-10-22T23:33:39.923 に答える