簡體   English   中英

用字符串分割字符串並插入列表C#

[英]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 1student 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM