[英]Splitting a string by a string and inserting into a list C#
所以我正在使用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
.
.
.
我想将每个细分分成一个列表,因为学生人数未知,并且每个学生的信息也会有所不同。 因此,我研究了常规字符串拆分和Regex字符串拆分。 对于常规字符串,我尝试了这一点。
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);
}
这是我用正则表达式尝试的:
StartParse.Add(Regex.Split("Student ID ");
我以前没有使用过Lists,但是据我了解,它们是动态的,易于使用。 我遇到的唯一麻烦是,我在split上看到的所有示例都与数组组合在一起,因此从语法上我不确定如何对字符串进行拆分并将其插入列表。 为了输出,我的目标是对学生细分进行划分,以便以后需要时可以调用特定的细分。
让我验证我是在那一批信息之后,而不是ID本身。 许多问题似乎都针对此,所以我觉得我需要验证一下。
对于那些建议其他存储体的人:
列表内容的示例:
position 0 will hold [<id> //bunch of info]
position 1 will hold [<anotherID> //bunch of info]
.
.
.
因此,我只是使用列表对我需要的信息进行多项操作。 如果我可以将信息细分为如上所示的列表,则该信息将更易于管理。 我知道字典,但是我必须根据段的内容将此信息存储在sql表中或文本文件中。 一个例子是,如果一个段确实很时髦,那么我会发送一个错误报告,指出一个学生的信息不好。 否则,将必要的信息插入sql表。 但是我必须处理细分市场中的多项内容,因此我觉得列表是最好的选择,因为我还必须在细分市场中来回移动,以与该细分市场中的较早事物进行交叉检查我发现。
这里没有必要使用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
形式的给定字符串,我将通过myString.Split(' ')[2]
自行获得x
,这是我传递给Select
的表达式的基础。
根据OP的评论,这里是一种获取所有数据而无需每批Student Id
的方法。
string[] batches = input.Split(new string[] { "student id " } StringSplitOptions.RemoveEmptyEntries);
如果您确实需要列表,则可以只调用ToList()
并将batches
类型更改为List<string>
但这可能只会浪费CPU周期。
这是一些伪代码,以及我要做什么:
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与骆驼肠衣混在一起:)
试试这个:
StartParse = new List<string>(Regex.Split(v, @"(?<!^)(?=student ID \d+)"));
(?<!^)(?=student ID \\d+)
,这意味着将字符串拆分为点student ID
而不是字符串的开头。
检查此代码
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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.