我想从文件中检索数据

时间:2019-06-14 06:06:43

标签: c#

当我输入ID卡号或电话号码时,如果ID或电话号码匹配,它应该从文件中提取行。我尝试了以下代码,但它获取的是ID号而不是带有该ID卡号的整行,例如名称,地址,电话号码。

string path=@"C:\Users\Precision\Desktop\testing\data.txt";
Console.WriteLine("Enter CNIC or Phone No");
string check = Console.ReadLine();
using (StreamReader sr = new StreamReader(path))
{
    string lines = sr.ReadToEnd();

    if (lines.Contains(check))
    {
        dirList.Add(lines);
        Console.WriteLine("Data Found Against {0}", check);

        string stringToSearch = check;
        string[] liness = File.ReadAllLines(path);
        foreach (string line in liness)
        {
            if (line.Contains(stringToSearch))
            {
                Console.WriteLine(line);
            }
        }
    }
    else
    {
        Console.WriteLine("No Data Found");
    }
}

示例数据:

Id Card No :123456789 Phone No :545454 First Name :asasa Surname:asasa House:sas Street:as Sector:as City:asasas Country :asasa

3 个答案:

答案 0 :(得分:0)

首先,您应该简化代码,例如实际上,您正在读取同一文件两次(sr.ReadToEnd()File.ReadAllLines(path))。然后,您应该尝试输出所有行(或更好的方法:在调试器中检查它们),以检查数据是否确实符合您期望的格式。另外,您还必须确定是否应该对输入的搜索字符串进行检查是否区分大小写。

答案 1 :(得分:0)

逻辑将取决于您如何分隔每个数据项。
如果每个项目都用新行(即\r\n)隔开,则应按以下步骤进行迭代:

public List<string> SearchList()
{
    var path = @"C:\Users\Precision\Desktop\testing\data.txt";

    Console.WriteLine("Enter CNIC or Phone No");
    var check = Console.ReadLine();

    var dirList = new List<string>();

    using (StreamReader sr = new StreamReader(path))
    {
        var lines = sr.ReadToEnd()
                      .Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

        foreach (var line in lines)
        {
            if (line.Contains($"Id Card No :{check}") || line.Contains($"Phone No :{check}"))
            {
                dirList.Add(line);
            }
        }
    }

    return dirList;
}

注意.Split()函数。需要根据数据的分离方式进行调整。

还请注意,如果您要搜索的文本恰好在不同的字段中,那么您将需要如何区分“身份证号码:”和“电话号码:”才能获得某种智能。

如果此列表很大,我强烈建议将这些数据放入数据库中,并使用SQL查询来适当地搜索项目,因为针对数据库进行了优化以搜索数据项。

字符串搜索通常处理缓慢,并且sr.ReadToEnd()会将 ALL 数据存储在内存中。如果文件很大,则应用程序将消耗的内存可能会很大。

答案 2 :(得分:0)

您可以尝试使用 Linq 查询文件。通常,文件读取是一项耗时的操作,这就是为什么我们只做一次。 如果您想以某种自定义格式表示record(即Console.WriteLine(record);是不够的),则必须对其进行解析,例如借助正则表达式

代码:

    using System.Linq; 
    using System.Text.RegularExpressions;
    ... 
    string path = @"C:\Users\Precision\Desktop\testing\data.txt";

    Console.WriteLine("Enter CNIC or Phone No");
    string check = Console.ReadLine();

    var records = File
      .ReadLines(path)
      .Where(line => line.Contains(check));

    Regex regex = new Regex(@"(?<name>[^:]+):\s*(?<value>\S*)");

    bool isFirstRecord = true; 

    foreach (string record in records) {
      if (isFirstRecord)
        Console.WriteLine("Data Found Against {0}", check);

      isFirstRecord = false;

      Dictionary<string, string> data = regex
        .Matches(record)
        .Cast<Match>()
        .ToDictionary(match => match.Groups["name"].Value.Trim(),
                      match => match.Groups["value"].Value.Trim(),
                      StringComparer.OrdinalIgnoreCase);

      Console.WriteLine(string.Join(Environment.NewLine, data
        .Select(pair => $"{pair.Key,-11} = {pair.Value}")));  
    }

    // If we haven't read any record 
    if (isFirstRecord) 
      Console.WriteLine("No Data Found");

结果:

Data Found Against 12345
Id Card No  = 123456789
Phone No    = 545454
First Name  = asasa
Surname     = asasa
House       = sas
Street      = as
Sector      = as
City        = asasas
Country     = asasa

如果您想要某种特定的输出格式,则可以轻松查询data字典,例如

Console.WriteLine($"Id: {data["Id Card No"]}; Phone: {data["Phone No"]}");