如何在c#</string>中从给定的文本文件创建2个单独的列表<string>

时间:2014-03-26 08:10:53

标签: c#

我收到了一个文本文件。文本文件的详细信息如下所述

  

ab | 123456受体0M9C [某个名称]   ABRAKADABRATDNPQLQVVIFSAAAAAAAAAABHDBSIISLTLLDSAMNJHDFBHGFBNFBHGHFBNVCN   AGHDGBEBEHGFNMFIFLGSTEFFLLASMSYDCYVAICKPLHYTTIMSDRICYQLIISSWLAGFLVIFPPLAM   ab | 145678受体00AB [某些名称] NABSNBFBFGBFNBNBNBFJHBFNBFNBJHJBFNBFVIIHSDSHLHTPMYFFLSNLSLVDLGYSSAVAPKTV   AALRSGDKAISYDGCAAQFFFFVGFATVECYLLASMAYDRHAAVCRPLHYTTTMTAGVCALLATGSYVSG   ab | 137565 receptor 0D0 [some name]   MKNKSMEIEFILLGLTDDPQLQIVIFLFLFLNYTLSLMGNLIIIILTLLDPRLKTPMYFFLRNFSFLEVIFTTVCIP   KJKDHDNDJFNFNNBFNBFBNBFBJBNFJNFJFGVALLYTSIAPLLNPFIYTLRNQQVKEVFWDVLQKNLCFSKRPF

我要创建2 List,

第一个列表名称(带[某个名称]的行) 第二个列表unique_code(所有大写字母的行)

名称和唯一代码彼此相关。

我可以使用以下代码

从文本文件中获取名称
List<string> Name = new List<string>();
System.IO.StreamReader file =new System.IO.StreamReader(filename);


var query = from line in File.ReadLines(filename)           //linq query to select the name
            where line.Contains("some name")
            select line;


        foreach (string line in query)                      //storing the name in a list
        {
            Name.Add(line);

        }

任何人都可以建议如何获取唯一代码的第二个列表。

2 个答案:

答案 0 :(得分:2)

也许:

List<List<string>> lists = File.ReadLines("Path")
    .GroupBy(l => l.Contains("[some name]"))
    .Select(g => g.ToList())
    .ToList();

如果名称行与其他行相关,我建议使用自定义类。这使您的代码更具可读性和可维护性。

以下是一个示例类:

public class Receptor
{
    public Receptor(string name)
    {
        this.Name = name;
        this.Codes = new List<string>();
    }

    public string Name { get; set; }
    public List<string> Codes { get; set; }
}

这是我要使用的循环:

List<Receptor> receptors = new List<Receptor>();
var lines = File.ReadLines("Path").SkipWhile(l => !l.Contains("[some name]"));

foreach (string line in lines)
{
    if (line.Contains("[some name]"))
        receptors.Add(new Receptor(line));
    else
        receptors.Last().Codes.Add(line);
}

答案 1 :(得分:0)

对于第二个列表,对于每一行,您可以使用正则表达式搜索所有字符是否为大写

List<String> list = new List<string>();
string pattern = @"^[^a-z]+$";
foreach (string line in query)
{
    Regex r = new Regex(pattern, RegexOptions.None);
    Match match = r.Match(line);
    if (match.Value != "")
        list.Add(match.Value);
   }