我收到了一个文本文件。文本文件的详细信息如下所述
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);
}
任何人都可以建议如何获取唯一代码的第二个列表。
答案 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);
}