我有一个记事本(.txt)文件,其中有三个字段,即ID Name和Location。我想使用streamreader在C#中读取这些数据,并检查文件中是否存在ID的条件。如果是的话,我应该将该行作为输出而不是错误。
假设我有以下txt文件,字段为
00125 JAMES LONDON
00127 STARK USA
00128 ARNOLD AUSTRALIA
现在,我应该要求用户输入ID。如果Id匹配,那么我应该将该特定行作为输出。例如。如果用户输入00127,那么我应该输出为
00127 JAMES LONDON
我知道如果数据存储在数据库中,这将非常简单。但是如果数据存储在.txt文件中会怎么样呢。
先谢谢
答案 0 :(得分: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
答案 1 :(得分:0)
您可以使用StreamReader
来读取文件中的内容。
然后,您可以使用String
拆分Split
。
这样,您就可以在二维数组中添加所有项目。然后数组看起来像{{00125, JAMES, LONDON}, {00127, STARK, USA}, {00128, ARNOLD, AUSTRALIA}}
。使用它,您可以将输入与每个数组的第一个条目进行比较,并相应地返回数据。
这应该让你清楚地了解从现在开始的方向。
答案 2 :(得分: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
。野外有很多样品......