Wyszukanie kilku stringów w pliku (ReadToEnd)

0

Witam. Potrzebuje wyszukać w pliku kilka tych samych stringów i poznać ich miejsce (index). Jeżeli przelecę plik metodą ReadToEnd to po próbie odszukania stringa za pomocą metody Contains odszukuje mi tylko pierwszy albo ostatni string, resztę pomija. Chciałbym to jakoś dać pod pętle ale nie wiem do jakiej długości się odwołać, przypuśćmy, że mam 4 takie stringi w całym pliku, przy pętli for(a = 0; a < ? (powinno być tyle ile jest stringów); a++) i podmieniamy te 4 stringi pojedynczo. Pozdrawiam :)

0

moze cos takiego?

public static List<int> AllIndexesOf(this string str, string value)
        {
            return Regex.Matches(str, value).Cast<Match>().Select(m => m.Index).ToList<int>();
        }
0

Przecież Contains potrafi jedynie stwierdzić, czy podciąg występuje, nie zwraca indeksu. ;]

W końcu chcesz znaleźć, czy podmienić?
Bo jeśli to pierwsze, to użyj metody IndexOf, która pozwala na podanie indeksu od którego ma zacząć wyszukiwanie.
Jeśli to drugie to użyj metody Replace.

0
        public int includesCount(string path)
        {
            string read = string.Empty;

            using (System.IO.StreamReader sr = new System.IO.StreamReader(path))
            {
                while (sr.Peek() > -1)
                {
                    read = sr.ReadLine();

                    if (read.Contains("woda"))
                    {
                        countOfIncludes++;
                    }
                }
                sr.Close();
                return countOfIncludes;
            }
        }

Poradziłem sobie w taki sposób, niezbyt mnie zadowala ale jakoś działa. Chodzi mi w pierwszej kolejności o znalezienie wszystkich stringów, które mają wartość np. "woda", bez konieczności jazdy tak jak tutaj linijka po linijce. Później chce je podmienić ale już skończyć z tym czytaniem linijki tylko przeczytać raz cały plik, przypisać do stringa i na nim operować m.in indexOf, Insert, Remove itd.

0

A co w przypadku, kiedy plik wyglada tak:


woda woda
woda woda
woda woda woda

na pierwszy rzut oka Twoj kod doliczy sie 3 wystapien;)

PS. Zakladajac, ze sie w ogóle skompiluje, bo nie widze gdzie deklarujesz countOfIncludes

0

Takie coś wystąpić nie może ale to prawda, wtedy się pieprznie, jedynie może być kilka stringów jeden pod drugim ale w jednej linijce kilka tych samych się nie zdarzy.

0
Magiczne Siodło napisał(a):

Później chce je podmienić ale już skończyć z tym czytaniem linijki tylko przeczytać raz cały plik, przypisać do stringa i na nim operować m.in indexOf, Insert, Remove itd.

No to akurat jest znacznie prostsze niż to, co robisz teraz:

string daneZPliku = File.ReadAllText(@"C:\plik.txt");
0

Jeżeli chodzi o późniejszą sprawę to własnie tak robię, czytam raz cały plik i operuje na stringu a jeżeli napisałeś to odnośnie szukania stringów to tak czy siak musiałbym je jakoś zliczyć a czym je przeczytam to raczej nie ma znaczenia.

0

W drugim poscie podałem Ci metode, ktora zwroci liste indeksów wystąpień pewnego stringa. Wywołujesz ją tak (to jest extension method):

string daneZPliku = File.ReadAllText(@"C:\plik.txt");
var indeksy = daneZPliku.AllIndexesOf("dupa");
int ilsoc = indeksy.Count;
0

Dobry jesteś :D. Czy to dzięki tej rzeczy samo leci po całym stringu i wszystko zbiera, podlicza i dopiero zwraca? Wybacz za niskopoziomowe pytanie

.ToList<int>()
0

wyobraź sobie, że ToList robi mniej więcej coś takiego:

List<T> ToList()
{
    var result = new List<T>();
    foreach (T t in this)
        result.Add(t);
    return result;
}

czyli konstruuje nową listę z elementami pobranymi podczas iteracji po kolekcji.

Chodzi o to, że metody z biblioteki LINQ są „leniwe”, tj. taki Select wcale nie wykonuje tego co obiecuje, a tylko zwraca pewien obiekt, który przeiterowany np. foreachem dopiero wykona całe zapytanie.

Niektóre metody LINQ jednak wykonują zapytanie natychmiast, i jest to właśnie ToList (bo chcemy mieć nie-LINQ-ową listę wypełnioną elementami), ale też np. Count (żeby zliczyć elementy trzeba je przeiterować)

Pytanie teraz, czy chcemy robić ToList, czy nie chcemy.
Powinno być tylko tam, gdzie wiemy że to już jest koniec zapytania. W przypadku powyżej - bez sensu jest robić ToList, jeśli zaraz za nim ma być Count - wystarczy samo Count.

0

Dzięki wielkie :)

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