none
請問這樣的字串內容該如何處理 RRS feed

  • 問題

  •  

    請想問的是...
    有一字串,其內容結果可能如下:
    string abc = "Mylove N \r\n Good Y \r\n LoveisLove J \r\n";

     

     

    那麼~~我想把上述字串存檔成如下方的格式

    <Name>Mylove</Name>
    <Value>N</Value>
    <Name>Good</Name>
    <Value>Y</Value>
    <Name>LoveisLove</Name>
    <Value>J</Value>

    請問這要怎麼做到...

    2008年9月5日 上午 06:43

解答

  • 上面已經有人幫你寫切割的函式了,你只要將切好的值交到 XmlTextWriter.WriteString() 就行了,但還要配合 WriteStartElement() 和 WriteEndElement() 才可以正確的寫到你要的位置。

     

    類似於這樣:

    Code Snippet

    for (int i=0; i<splitedstrs.length; i++) // splitedstrs 是已切好的字串陣列。

    {

          if (i % 2 == 0)

          {

              xw.WriteStartElement("Name");

              xw.WriteString(str);

              xw.WriteEndElement();

          }

          else

          {

              xw.WriteStartElement("Value");

              xw.WriteString(str);

              xw.WriteEndElement();

          }

    }

     

     

     

     

    2008年9月5日 上午 08:14
    版主
  •  

    謝謝小朱大大您的回覆....

     

    我剛才有去把這裡及藍色小鋪那裡的分割code全部都試過一次

     

    最後採用您的跟藍色小鋪那裡的達可達大大的答案

    這樣最後就能照我想要的那樣寫入檔案~~~

     

     

    真的是萬分的感謝您....

     

     

     

    我還記得上次~~~

    也是勞您費心的幫忙.....

     

    以下是我 code 中的容....成功的部份~~~

     

    就是當作感謝 小朱大大您  及  達可達大大~~~

    最後把我試成功的結果跟您及大家報告......

     

    Code Snippet

     

    string NewstrStatus = strStatus;
    NewstrStatus = NewstrStatus.Replace("\r\n", "@");
    NewstrStatus = NewstrStatus.Trim('@');
    StringBuilder sb = new StringBuilder();
    foreach (string f_str in NewstrStatus.Split('@'))
    {

        string[] aryStr = f_str.Trim().Split(' ');
        if (aryStr.Length == 2)
        {

            Status.WriteStartElement("Name");
            Status.WriteString(aryStr[0]);
            Status.WriteEndElement();


            Status.WriteStartElement("Value");
            Status.WriteString(aryStr[1]);
            Status.WriteEndElement();
         }

    }
    Status.Close();

     

     

     

    不過

    特別的是.....

    他寫出來的是一整行

    不像會自動換行.....

     

    但這部份我會再去 survey  一下....

    等真的不行

    再過來這請教小朱大大及各位高手....

     

    再次地感恩您~~~

    2008年9月5日 上午 09:40

所有回覆

  • 試試看


    private void button1_Click(object sender, EventArgs e)


    {


        string abc = "Mylove N \r\n Good Y \r\n LoveisLove J \r\n";


        StreamWriter sw = new StreamWriter("test.txt");


        StringBuilder sb = new StringBuilder();


     


        foreach( Match m in Regex.Matches(abc, @"(\S+)\s+(\S+)\s+\r\n"))


        {


            sb.AppendFormat("<Name>{0}</Name>{1}<Value>{2}</Value>{1}", m.Groups[1], Environment.NewLine, m.Groups[2]);


        }


     


        sw.WriteLine(sb);


        sw.Close();


    }



    2008年9月5日 上午 06:58
  •  

    哇~~

    好強喔~~

     

    但是如果我是要寫成xml的格式~~~

    也是這樣的寫法嗎?

     

    對不起~~~ 我剛才沒有表達的很清楚.....

    是否能再請您再多給我點提示呢?  謝謝

     

    2008年9月5日 上午 07:10
  • 直接使用 XmlTextWriter 或 XmlDocument 來處理才是王道 ...。

     

    2008年9月5日 上午 07:19
    版主
  •  

    謝謝小朱大大~~

    我是用您說的那 xmltextwriter 的方法

    不過我現在就是卡在說這個問題

     

    我的原始 code 如下

     

    Code Snippet

     

    foreach (Button button in MyButton)
    {
       if (button.Description == "Happy")
       {
           XmlTextWriter Status_Writer = new XmlTextWriter(F_Status_path, null);

           Status_Writer.WriteStartElement("Name", null);
           Status_Writer.WriteString(strStatus.ToString());
           Status_Writer.WriteEndElement();

     

           WriteSomethingOut(strStatus);

     

           break;
        }
    }

     

     

     

    但如這樣的寫法

    會把那 strStatus 的內容全部寫入到 <Name></Name>之中

    並不會把每個Element分別寫入....

     

     

    所以~~~

    現在那 strStatus 那串內容就是不知道該如何分別截出來

    因為那串內容中有「兩個」項目

    也就是現行寫出的格式為: 「 Name1 Value1\r\nName2 Value2\r\n.......」

    我就是想把那 Name1, Name2.....

    及 Value1,  Value2 ..... 分別取出

    然後再用 xml 格式寫入檔案

     

    最後那 xml 的檔案格式就是成為那

     

    <Name>Name1</Name>

    <Value>Value1</Value>

    <Name>Name2</Name>

    <Value>Value2</Value>

    .........

     

    所以才請問各位前輩高手

    像這樣的問題要如何把那串內容一一抽離那裡面的項目.....

     

     

     

    2008年9月5日 上午 07:52
  • 可是你在寫入之前要先切好,再使用 WriteString() 把資料送到 XML 中 ...

    你那個寫法是連切都沒切吧 ...

     

    2008年9月5日 上午 07:58
    版主
  • 對了
    再補充一點
    那原本的字串出來的結果是

    Name1 N\r\nName2 F\r\nName3 F\r\n....

    每個Name跟隨後的 Value(即 N 和 F)中有個「空格」

    但 Value跟\r\n  及  \r\n跟下一個Name 都是沒有空格的情況的....

     

    2008年9月5日 上午 08:01
  •  

    哈哈~~

    被小朱大大發現了~~~> <

    沒錯....

    我就是不知道怎樣子切說....

    所以~~~

    我那只是先測試看輸出到檔案後會有怎樣的一個情況啦~~~

     

    因此

    就是才疏學淺

    所以來此請教各位高手

    請各位能給我一點指引

    好讓我能學習

     

     

     

    2008年9月5日 上午 08:03
  • 上面已經有人幫你寫切割的函式了,你只要將切好的值交到 XmlTextWriter.WriteString() 就行了,但還要配合 WriteStartElement() 和 WriteEndElement() 才可以正確的寫到你要的位置。

     

    類似於這樣:

    Code Snippet

    for (int i=0; i<splitedstrs.length; i++) // splitedstrs 是已切好的字串陣列。

    {

          if (i % 2 == 0)

          {

              xw.WriteStartElement("Name");

              xw.WriteString(str);

              xw.WriteEndElement();

          }

          else

          {

              xw.WriteStartElement("Value");

              xw.WriteString(str);

              xw.WriteEndElement();

          }

    }

     

     

     

     

    2008年9月5日 上午 08:14
    版主
  •  

    謝謝小朱大大您的回覆....

     

    我剛才有去把這裡及藍色小鋪那裡的分割code全部都試過一次

     

    最後採用您的跟藍色小鋪那裡的達可達大大的答案

    這樣最後就能照我想要的那樣寫入檔案~~~

     

     

    真的是萬分的感謝您....

     

     

     

    我還記得上次~~~

    也是勞您費心的幫忙.....

     

    以下是我 code 中的容....成功的部份~~~

     

    就是當作感謝 小朱大大您  及  達可達大大~~~

    最後把我試成功的結果跟您及大家報告......

     

    Code Snippet

     

    string NewstrStatus = strStatus;
    NewstrStatus = NewstrStatus.Replace("\r\n", "@");
    NewstrStatus = NewstrStatus.Trim('@');
    StringBuilder sb = new StringBuilder();
    foreach (string f_str in NewstrStatus.Split('@'))
    {

        string[] aryStr = f_str.Trim().Split(' ');
        if (aryStr.Length == 2)
        {

            Status.WriteStartElement("Name");
            Status.WriteString(aryStr[0]);
            Status.WriteEndElement();


            Status.WriteStartElement("Value");
            Status.WriteString(aryStr[1]);
            Status.WriteEndElement();
         }

    }
    Status.Close();

     

     

     

    不過

    特別的是.....

    他寫出來的是一整行

    不像會自動換行.....

     

    但這部份我會再去 survey  一下....

    等真的不行

    再過來這請教小朱大大及各位高手....

     

    再次地感恩您~~~

    2008年9月5日 上午 09:40
  • 這樣寫不就很輕鬆愉快....


    private void button1_Click(object sender, EventArgs e)


    {


        var abc = new[] {"Mylove N \r\n Good Y \r\n LoveisLove J \r\n"};


        var xml = new XElement("Results",


                               from s in abc


                               let matches = Regex.Matches(s, @"(\S+)\s+(\S+)\s+\r\n")


                               from Match m in matches


                               select new[]{


                                              new XElement("Name", m.Groups[1]),


                                              new XElement("Value", m.Groups[2])


                                          });


     


        xml.Save("Result.xml");


    }



    2008年9月5日 下午 12:32
  • chhuang 大大~~也謝謝您提供的正規表示式的方法

    如你所說的

    這樣子是真的很棒~~~

    你這次還用到 LINQ....果然很強....

     

    可是我的開發是 vs2005

    所以......殘念啦....

     

    但是....你上一個寫的Code我有試過

    最後檔案內的內容就不是我要的

    且那檔案內也沒有寫入內容...

    後來我有去 Debug 看

    好像出在 (你於本篇第一次發言的那個 Code 中)

     foreach( Match m in Regex.Matches(s, @"(\S+)\s+(\S+)\s+\r\n"))

     

    結果.....跑到了 in 就直接跳出也沒跑給m

    我覺得很弔詭...

    我也不清楚問題出在哪?  ><

    所以

    後來也有其他前輩及小朱大大的指導....

    因此我後來就先用他們的方法試了一下.....

     

    我之前上課

    老師有說過

    會用正規表示式的人

    那程設功力就很強

     

    所以

    我也深信您的方法一定通的

    可能是我個人不太會用

    也或許一開始我表達我的問題太過簡單

    以至可能讓您費心不少...

     

     

    不過看您這麼地用心回答

    我真的也是很由衷地感謝您....

     

    謝謝您對我的問題的熱心幫忙.....

    再次地感謝您啦.....謝謝

     

     

     

    2008年9月5日 下午 12:43