none
如何只替換一行或者一段文字? RRS feed

  • 問題

  • 小弟想寫一個功能如下

    將文字檔內文字 12345   替換成  54321

     

    test.txt

    AAAAAAAAAAAAA

    BBBBBBBBBBBBB

    CCC12345CCCCCC

    DDDDDDDDDDDDD

     

    可是我用 StreamReader 得一行一行讀近來

    再判斷當中是否有字元 "12345"

     

    Dim sr As New StreamReader(FilePath)
    InputTXT = sr.ReadLine + Chr(10)


    if  InStr(InputFile, "12345") < 1

    Then
       InputFile += InputFile

    else

      ..................將12345替換成54321
    End If

    sr.close() 

    然後再寫回去 text.txt時 發現文字檔格式變了,用UltraEdit開啟會問我要不要存成DOS格式

            

    Dim sw As New StreamWriter(FilePath)
    sw.Write(HostsFile)
    sw.close()       

     

    請問有甚麼正確的方法能做到這樣的動作呢?  而不去更動原本檔案的格式

    甚至不用一行一行的讀近來

    我試過 用sr.ReadToEnd() 一次全部讀近來,但是卻發現會有換行的問題 疑似少了Chr(10)

    請大大指導一下 謝謝

    2008年9月14日 下午 04:07

解答

  • 如果檔案不是很大的話,導是可以以下程式碼

    Code Snippet



    private void button2_Click(object sender, EventArgs e)

    {

        string filePath = "test.txt";

        StreamReader sr = new StreamReader("test.txt");

        StringBuilder sb = new StringBuilder(sr.ReadToEnd());

        sr.Close();

     

        StreamWriter sw = new StreamWriter(filePath);

        sb.Replace("12345", "54321");

        sw.Write(sb);

        sw.Close();

    }

     

     

    2008年9月14日 下午 04:38
  • 妳可以參考使用 Regex 來進行取代,參考


    Code Snippet



    private void Form1_Load(object sender, EventArgs e)

     {

        string filePath = "test.txt";

     

        StreamReader sr = new StreamReader("test.txt");

        string s = sr.ReadToEnd();

        sr.Close();

     

        StreamWriter sw = new StreamWriter(filePath);

        s = Regex.Replace(s, @"12345\w+", "54321AAAAAA");

        sw.Write(s);

        sw.Close();

     }

     

     

     

    2008年9月15日 下午 04:52

所有回覆

  • 如果檔案不是很大的話,導是可以以下程式碼

    Code Snippet



    private void button2_Click(object sender, EventArgs e)

    {

        string filePath = "test.txt";

        StreamReader sr = new StreamReader("test.txt");

        StringBuilder sb = new StringBuilder(sr.ReadToEnd());

        sr.Close();

     

        StreamWriter sw = new StreamWriter(filePath);

        sb.Replace("12345", "54321");

        sw.Write(sb);

        sw.Close();

    }

     

     

    2008年9月14日 下午 04:38
  • 如果不知道"12345"的位置,每讀一行可以就把內容騰到另外一個檔案,遇到"12345"的再把內容修改後寫到另一個檔,最後把檔名改一下;如果知道"12345"的位置可以用fileStream搭配seek來變更特定位置的內容。

    2008年9月15日 上午 02:11
    版主
  • 感謝大大指導Replace替換字串真是方便

    但如果是連同 12345後面的CCC字元都要一併變更

    Replace好像就不行了,

     

    例如 :

    原本該行為

    CCC12345CCCCCC

    想替換成

    CCC12345AAAAAA

     

    除了一行一行讀取以外

    該怎麼處理呢?

    2008年9月15日 上午 03:41
  • 妳可以參考使用 Regex 來進行取代,參考


    Code Snippet



    private void Form1_Load(object sender, EventArgs e)

     {

        string filePath = "test.txt";

     

        StreamReader sr = new StreamReader("test.txt");

        string s = sr.ReadToEnd();

        sr.Close();

     

        StreamWriter sw = new StreamWriter(filePath);

        s = Regex.Replace(s, @"12345\w+", "54321AAAAAA");

        sw.Write(s);

        sw.Close();

     }

     

     

     

    2008年9月15日 下午 04:52
  • 感謝前輩指導

     

    Regex.Replace真方便好用
    2008年9月16日 上午 12:50