C# 如果我们将数据存储在.txt文件中,如何验证和返回数据?
我有一个记事本(.txt)文件,它有三个字段,即ID名称和位置。我想使用streamreader在C#中读取这些数据,并检查文件中是否存在ID。如果是,我应该将该行作为输出else错误获取 假设我有下面的txt文件,其中的字段为C# 如果我们将数据存储在.txt文件中,如何验证和返回数据?,c#,streamreader,C#,Streamreader,我有一个记事本(.txt)文件,它有三个字段,即ID名称和位置。我想使用streamreader在C#中读取这些数据,并检查文件中是否存在ID。如果是,我应该将该行作为输出else错误获取 假设我有下面的txt文件,其中的字段为 00125 JAMES LONDON 00127 STARK USA 00128 ARNOLD AUSTRALIA 现在,我应该要求用户输入该ID。如果ID匹配,那么我应该将该特定行作为输出。例如,如果用户输入00127,那么我应该得到输出 00127 JA
00125 JAMES LONDON
00127 STARK USA
00128 ARNOLD AUSTRALIA
现在,我应该要求用户输入该ID。如果ID匹配,那么我应该将该特定行作为输出。例如,如果用户输入00127,那么我应该得到输出
00127 JAMES LONDON
我知道如果数据存储在数据库中,这将非常简单。但如果数据存储在.txt文件中会怎样呢
提前感谢您可以使用
StreamReader
从文件中读取内容
然后,您可以使用split
拆分字符串
这样,您就可以在二维数组中添加所有项。然后数组看起来像{{00125,詹姆斯,伦敦},{00127,斯塔克,美国},{00128,阿诺德,澳大利亚}
。使用它,您可以将输入与每个数组的第一个条目进行比较,并相应地返回数据
这应该给你一个清晰的方向,从现在开始 有几个选项:
- 每次你接到请求都要看那该死的文件。如果文件很小并且请求不频繁,这将很好地工作。您逐行阅读,并将
id
与用户的id
进行比较。实现起来真的很快,但在资源利用方面却非常愚蠢。运行时复杂性为O(N)-在最坏的情况下,您需要扫描整个文件
- 您可以修改第一个选项并添加一层缓存。如果您经常查询相同的
id
,您将获得很好的性能提升。运行时复杂性仍然是O(N)-在最坏的情况下,您需要扫描整个文件。而这还远远不够快
- 您还可以尝试对文件
ids
进行一次排序。使用最佳算法,这将花费O(N x Log(N)
时间,即您一次预处理数据所花费的时间。但是,任何读取查询都可以在O(Log(N))
中执行,使用基于id
的二进制搜索
如果您要查找代码片段,我会搜索StreamReader
,TextReader
,StreamWriter
,二进制搜索
,快速排序
。在野外有很多示例…最简单的解决方案(假设您有固定的ID格式-五位数):
创建以行作为值和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
的dictionary。这将使您的代码具有强类型并易于维护:
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
你试过什么?你自己研究过吗?还有:是所有的东西都在一行中,还是ID名称和位置在一行中,然后下一个ID名称和位置在下一行中?在任何情况下,String.Split(“”)
,这可能是相关的-
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