3

我有一个记事本 (.txt) 文件,其中包含三个字段,即 ID 名称和位置。我想使用 streamreader 在 C# 中读取这些数据并检查文件中是否存在 ID 的条件。如果是,我应该将该行作为输出,否则错误。

假设我有以下 txt 文件,其字段为

00125  JAMES  LONDON
00127  STARK  USA
00128  ARNOLD AUSTRALIA

现在,我应该要求用户在那里输入 ID。如果 Id 匹配,那么我应该将该特定行作为输出。例如,如果用户输入 00127 那么我应该得到输出

00127 JAMES LONDON

我知道如果数据存储在数据库中,这将非常简单。但是,如果数据存储在 .txt 文件中会怎样。

提前致谢

4

3 回答 3

1

最简单的解决方案(假设您有固定的 ID 格式 - 五位数字):

var users = File.ReadAllLines("data.txt")
                .ToDictionary(line => line.Substring(0, 5));

这将创建字典,其中行作为值,id 作为键。用法:

string line = users["00125"]; // 00125  JAMES  LONDON

那是最简单的解决方案。但实际上,我会介绍一些课程,例如:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }

    public static User Parse(string s)
    {
        var parts = s.Split(new []{' '}, StringSplitOptions.RemoveEmptyEntries);
        return new User {
            Id = Int32.Parse(parts[0]),
            Name = parts[1],
            Location = parts[2]
        };
    }

    public override string ToString()
    {
        return String.Format("{0:00000} {1} {2}", Id, Name, Location);
    }
}

然后解析每一行并将用户放入类型的字典Dictionary<int, User>。这将使您的代码具有强类型并且更易于维护:

var users = File.ReadAllLines("data.txt")
                .Select(line => User.Parse(line))
                .ToDictionary(u => u.Id);

var user = users[127];
string name = user.Name; // STARK
Console.WriteLine(user); // 00127 STARK USA
于 2013-02-28T15:11:21.590 回答
0

您可以使用StreamReader读取文件中的内容。

然后,您可以拆分Stringusing Split

这样,您就可以将所有项目添加到二维数组中。然后数组看起来像{{00125, JAMES, LONDON}, {00127, STARK, USA}, {00128, ARNOLD, AUSTRALIA}}. 使用它,您可以将输入与每个数组的第一个条目进行比较,并相应地返回数据。

这应该让您清楚地了解从现在开始的方向。

于 2013-02-28T15:01:38.247 回答
0

有几种选择:

  • 每次收到请求时都要阅读该死的文件。如果文件很小并且请求不频繁,这将正常工作。您逐行阅读,并与id用户的id. 实施起来确实很快,但在资源利用方面非常愚蠢。运行时间复杂度为 O(N) - 在最坏的情况下您需要扫描整个文件。

  • 您可以修改第一个选项并添加一层缓存。如果您经常查询相同的id内容,您将获得很好的性能提升。运行时间复杂度仍然是 O(N) - 在最坏的情况下您需要扫描整个文件。而这离快速还差得很远。

  • 您也可以尝试对文件进行ids一次排序。使用最好的算法,这将需要O(N x Log(N)时间,即您在预处理数据时所花费的时间。但是,任何读取查询都可以O(Log(N))使用基于id.

如果您正在寻找代码片段,我会搜索StreamReader, TextReader, StreamWriter, binary search, quick sort. 野外有很多样品...

于 2013-02-28T15:06:44.573 回答