3

ユーザー名、ユーザーID、ログインおよびログアウト時間を含むテキストファイルがあります。このテキスト ファイルから、ユーザー ID と、そのユーザーがその特定の日付にログインした回数を取得する必要があります。Windows アプリケーションで C# (.NET) を使用してこれを行っています。このコードを試しましたが、テキスト全体を文字列 strRead に取得しています。その strRead では、日付に基づいてユーザーのログイン数を取得する必要があります。

StreamReader strmrdr = new StreamReader("Logfiles.txt");
            string strRead = strmrdr.ReadToEnd();


Username:Rajini||UserId:abc||Userlogintime:10/19/13 12:33:29 PM||UserLogoutTime:10/19/13 12:33:57 PM

Username:Rajini||UserId:abc||Userlogintime:10/19/13 12:35:29 PM||UserLogoutTime:10/19/13 12:36:57 PM
4

4 に答える 4

2

これはそれほど難しいことではなく、日付とユーザー名に基づいたカウントのみが必要なので、形式を完全に解析しようとするより複雑なソリューションの多くを避けたいと思います。ここでは、単純な正規表現ベースのソリューションで十分です。

var loginInfo =
    // Read the lines in the file, one by one
    File.ReadLines(args[0])
        // Get a match with appropriate groups for the individual parts
        .Select(l =>
            Regex.Match(l,
                @"Username:(?<username>[^|]+)\|\|
                  UserId:(?<userid>[^|]+)\|\|
                  Userlogintime:(?<date>\S+)", RegexOptions.IgnorePatternWhitespace))
        // Create a new object with the user name and date
        .Select(m => new {
            Username = m.Groups["username"].Value,
            Date = DateTime.Parse(m.Groups["date"].Value, CultureInfo.GetCultureInfo("en-us"))
        })
        // Group by itself, that is, collapse all identical objects into the same group
        .GroupBy(i => i)
        // Create a new object with user name, date and count
        .Select(g => new {
            Username = g.Key.Username,
            Date = g.Key.Date,
            Count = g.Count()
        });

foreach (var info in loginInfo) {
    Console.WriteLine("{0} {1} {2}", info.Username, info.Date, info.Count);
}

これにより、わずかに拡張されたデータセットで次の出力が生成されます。

Rajini 2013-10-19 00:00:00 2
Test 2013-10-19 00:00:00 1
Rajini 2013-10-20 00:00:00 1
Test 2013-10-20 00:00:00 3
Rajini 2013-10-21 00:00:00 1
于 2013-10-19T09:45:41.690 に答える
0

StreamReader.ReadLine の使用をお勧めします

読んでいる間、毎日のログイン数を増やすことができます。方法に問題はありませんがReadToEnd

読み取り中に文字列を解析する必要があります。区切り文字があるため、解析が容易になります。これにはString.Splitメソッドを使用できます。

もう 1 つの提案は、執筆中の毎日のログイン数を別の列に保存することです。こうすれば、読むのが速くなります。

于 2013-10-19T09:22:11.387 に答える