所以我正在使用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是最好的方式,因为我还必须在细分中来回交叉检查信息中的早期事物。我发现。
答案 0 :(得分:1)
此处无需使用RegEx,我建议不要使用它。简单地在白色空间上分裂就可以了。让我们假装你有一个列表,其中包含每一行(student ID 1
,student 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;
}