用字符串拆分字符串并插入列表C#

时间:2014-04-11 16:04:55

标签: c# regex string list split

所以我正在使用C#和Visual Studio。我正在阅读学生及其信息的档案。学生人数多种多样,但我想抓住他们的信息。目前我只想根据字符串“学生ID”对学生的信息进行分段,因为每个学生的部分都以学生ID开头。我正在使用ReadAllText并将其设置为等于字符串,然后将该字符串提供给我的函数splittingStrings。该文件将如下所示:

student ID 1
//bunch of info

student ID 2 
//bunch of info

student ID 3 
//bunch of info
.
.
.

我想将每个片段分成一个列表,因为学生人数不详,每个学生的信息会有所不同。所以我查看了常规字符串拆分和正则表达式字符串拆分。对于常规字符串我试过这个。

        public static List<string> StartParse = new List<string>(); 

        public static void splittingStrings(string v)
        {
            string[] DiagDelimiters = new string[] {"Student ID "};

            StartParse.Add(v.Split(DiagDelimiters, StringSplitOptions.None);   
        }

这就是我用Regex尝试的东西:

StartParse.Add(Regex.Split("Student ID ");

之前我没有使用过列表,但从我读过的内容来看,它们是动态且易于使用的。我唯一遇到的麻烦是我看到的所有使用split的例子都与数组结合,所以语法上我不知道如何对字符串进行拆分并将其插入列表中。对于输出,我的目标是将学生片段分开,这样如果我需要,我可以稍后调用特定片段。


让我验证我是在那一批信息之后,而不仅仅是ID。很多问题似乎都集中在那上面,所以我觉得我需要对此进行验证。

建议其他存储机构:

列出的列表示例:

position 0 will hold [<id> //bunch of info] 
position 1 will hold [<anotherID> //bunch of info]
.
.
.

所以我只是使用List对我需要的信息进行多项操作。如果我可以将它们分成如上所示的列表,那么这些信息将更易于管理。我知道字典,但我必须将这些信息存储在sql表或文本文件中,具体取决于段的内容。一个例子是如果一个片段真的很时髦,那么我会发送一个错误报告,一个学生的信息是坏的。否则将必要的信息插入sql表。但我不得不处理来自细分市场的多个事情,所以我觉得List是最好的方式,因为我还必须在细分中来回交叉检查信息中的早期事物。我发现。

4 个答案:

答案 0 :(得分:1)

此处无需使用RegEx,我建议不要使用它。简单地在白色空间上分裂就可以了。让我们假装你有一个列表,其中包含每一行(student ID 1student ID 2,等等)你可以非常简单地得到一个id的列表;

  List<string> ids = students.Select(x => x.Split(' ')[2]).ToList();

上面的陈述基本上说,对于学生中的每个字符串,拆分字符串并返回第三个标记(索引2,因为它是0索引)。然后我调用ToList,因为默认情况下Select会返回IEnumerable<T>,但我不会担心这些细节。如果你没有列出你所展示的每一行的列表,那么这个想法会保持不变,只有你在分割字符串时逐个添加项目ids列表。对于student id x形式的给定字符串,我会x使用myString.Split(' ')[2]来获取Select,这是我传递给Student Id的表达式的基础。

根据OP的评论,这里是一种获取所有数据的方法,而不是每批的string[] batches = input.Split(new string[] { "student id " } StringSplitOptions.RemoveEmptyEntries); 部分。

ToList()

如果您确实需要一个列表,那么您只需调用batches并将List<string>的类型更改为{{1}},但这可能只是浪费CPU周期。

答案 1 :(得分:0)

这里有一些伪代码,以及我要做的事情:

List<Integer> ids;

void ParseStudentId(string str) {
  var spl = str.split(" ");
  ids.add(Integer.parseInt(spl[spl.length-1])); // this will fetch "1" from "Student Id 1"
}

void main() {
  ParseStudentId("Student Id 1");
  ParseStudentId("Student Id 2");
  ParseStudentId("Student Id 3");

  foreach ( int id in ids )
    Console.WriteLin(id); // will result in:
                          // 1
                          // 2
                          // 3
}

原谅我。我是一名java程序员,所以我将Pascal与骆驼套管混合:)

答案 2 :(得分:0)

试试这个:

StartParse = new List<string>(Regex.Split(v, @"(?<!^)(?=student ID \d+)"));

(?<!^)(?=student ID \d+)表示在点student ID处拆分字符串但不在字符串的开头。

答案 3 :(得分:0)

检查此代码

    public List<string> GetStudents(string filename)
    {
        List<string> students = new List<string>();
        StringBuilder builder = new StringBuilder();
        using (StreamReader reader = new StreamReader(filename)){
            string line = "";
            while (!reader.EndOfStream)
            {
                line  = reader.ReadLine();
                if (line.StartsWith("student ID") && builder.Length > 0)
                {
                    students.Add(builder.ToString());
                    builder.Clear();
                    builder.Append(line);
                    continue;
                }

                builder.Append(line);
            }

            if (builder.Length > 0)
                students.Add(builder.ToString());
        }

        return students;
    }