Zmiana tekstu w pliku

0

Witam,
VS2010Pro. W pliku plik.rtf podmieniam w wielu miejscach teksty. I działa ok.

Ale aby skrócić czas przetwarzania chciałem zastosować zmienną logiczną b1, dzięki czemu po dokonaniu zmiany w kolejnych liniach pliku dana zmienna nie będzie już szukana i czas miał się skrócić.

Problem jest ważny, bo jeśli rtf ma 1000 linii i przy podmianie jednego tekstu zajmuje 0,5 sekundy to przy np 100 podmianach czas może wynieść 50 sekund, a to już jest MASAKRA dla czekającego na wygenerowanie pliku.

Niestety po dopisaniu instrukcji

b1 = false;

w ogóle nie wykonuje się zmiana tekstu dla zmienna_1.

Dlaczego i jak to zmienić?

bool b1 = true;
StringBuilder strBui = new StringBuilder();
using (StreamReader sr = new StreamReader(plikRtf)
{
    string line = "";
    while ((line = sr.ReadLine()) != null)
    {
        strBui.AppendLine(line);
        if (b1)
        {
            strBui.Replace("<ZMIENNA_1>", zmienna_1);
            b1 = false;  // to podstawienie nie daje efektu
        }
        strBui.Replace("<ZMIENNA_2>", zmienna_2);
        strBui.Replace("<ZMIENNA_3>", zmienna_3);
        strBui.Replace("<ZMIENNA_4>", zmienna_4);
    }
}

Bardzo proszę o pomoc, szacun dla wszystkich i oczywiście pozdrowienia dla somekinda i ktosia.:-)
mm

3

Każdą linijkę pliku wczytujesz oddzielnie i dopisujesz do StringBuildera, a potem wywołujesz metodę Replace, która operuje na całym obiekcie StringBuildera, czyli nie tylko na nowej linijce, ale i na wszystkich poprzednich. Nic dziwnego, że działa powoli.

  1. Nie czytaj pliku po linii, tylko wczytaj cały plik do jakiejś zmiennej typu string (np. za pomocą metody File.ReadAllText).
  2. Wywołaj Replace na tym stringu (albo na StringBuilder z niego utworzonym, nie wiem, czy będzie jakaś różnica w wydajności, sprawdź sam). Jedno wywołanie Replace wystarczy, aby zamienić wszystkie teksty w danym stringu, nie potrzeba tu żadnej pętli.
0

Dzięki. Poszło błysk:

string s = File.ReadAllText(PlikRoboczy, Encoding.GetEncoding(1250));
StringBuilder strBui = new StringBuilder(s);

 strBui.Replace("<ZMIENNA_01>", (string)Session["zmienna_01"]);
 // ....
 strBui.Replace("<ZMIENNA_55>", (string)Session["zmienna_55"]);
s = strBui.ToString();
File.WriteAllText(PlikRoboczy, s, Encoding.GetEncoding(1250));

a tu jeszcze dobry opis: http://www.dotnetperls.com/replace

0

ten kawałek:

strBui.Replace("<ZMIENNA_01>", (string)Session["zmienna_01"]);
 // ....
 strBui.Replace("<ZMIENNA_55>", (string)Session["zmienna_55"]);

ubierz w pętelkę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1