Wyszukaj i wypisz

0

Witam,

Chcę stworzyć program, który wczyta plik .txt zawierający zdania ( każde zdanie w nowej linii). Następnie zapyta użytkownika co chce wyszukać, program ma przeszukać każde zdanie w poszukiwaniu tego co wpisał użytkownik, a następnie wypisze zdania, które zawierają szukane frazy w kolejności zależnej od ilości wyszukanych fraz.
Czyli:
wprowadzam : "C# to zło"
program wypisuje:
"C# to zło wcielone" -> pierwszy na liście ponieważ znalazł najwięcej szukanych fraz (C# , to, zło)
"C# to fajny język" -> kolejne ponieważ znalazł tylko (C# oraz to)
"C# jest językiem programowania" - > ostatni ponieważ znalazł najmniej szukanych fraz (C#)

Czy ma ktoś jakiś pomysł jak to ugryźć ?

0

Czego konkretnie nie wiesz? Jak wczytać plik tekstowy? - jest w google, jak odczytać linię po linii? -jest w google. Jak przeszukać tekst? - jest w google. To sa podstawowe rzeczy i kaźdą z nich w miarę rozgarniety człowiek ze znajomością podstaw c# ogarnie w dzień. A jak ci sie nie chce to jest tu dział zlecenia

0

Wczytywanie pliku mam ogarniete wczytuje przez 'File.ReadAllLines ();' następnie wprowadzone słowo dzieliłem przez 'tekst.Split ();' i przeszukiwałem tekst z pliku za pomocą ' if (tekst.Contain());' i jeśli w tym ifie dałem 'Console.WriteLine ();' to wyświetla mi teksty, które zawierają szukane słowa jednak nie wiem jak zrobić aby wyświetlić je w w/w kolejności.

1

Plik.txt:

c# to boski jezyk
c# to boski
c# to boski c# to boski

User wpisał:

c# to boski jezyk

Wynik:
linijka z pliku .txt | ilość wystąpień słów z tego co wpisał user w danej linijce

c# to boski c# to boski | 6
c# to boski jezyk | 4
c# to boski | 3

Chyba działa :D

public static int AmountOfSubStringsInFileLine(string FileLine, string userInput)
{
    int counter = 0;

    foreach (var word in FileLine.Split(' '))
    {
        if (userInput.Contains(word))
        {
            counter++;
        }
    }

    return counter;
}

static void Main(string[] args)
{
    Dictionary<int, int> occurances = new Dictionary<int, int>();

    string path = @"c:\file.txt";

    List<string> lines = File.ReadAllLines(path).ToList();

    string userInput = Console.ReadLine();

    for (int i=0; i<lines.Count; i++)
    {
        occurances.Add(i,  AmountOfSubStringsInFileLine(lines[i], userInput));
    }

    var DictionarySortedByValueAsDescending = from entry in occurances orderby entry.Value descending select entry;

    foreach (var element in DictionarySortedByValueAsDescending)
    {
        Console.WriteLine($"{lines[element.Key]} | {element.Value}");
    }
}
1

@WeiXiao: w foreachu nie pisz zapytań, bo kod staje się wtedy bardzo nieczytelny. Dodatkowo niepotrzebnie dzielisz wczytany tekst na wyrazy, wystarczy użyć Contains no i niepotrzebnie marnujesz pamięć, bo kopiujesz tekst do słownika zamiast użyć indeksów wczytanych linii.

Dictionary<int, List<int>>

gdzie kluczem jest liczba wystąpień, a wartością lista indeksów linii pobranych z pliku

Mógłbyś, też nie pobierać wszystkiego od razu tylko enumerować po liniach w pliku. Wtedy trzeba by bylo już zapisać te linie tego tekstu, ale to i tak lepiej ustalić klucz słownika na liczbę wystąpień, bo wtedy szybciej się to posortuje i też mniej zużyje zasobów, czyli coś takiego

Dictionary<int, List<string>>
0
Manuel.Artificer napisał(a):

Dodatkowo niepotrzebnie dzielisz wczytany tekst na wyrazy, wystarczy użyć Contains no i niepotrzebnie

O to Ci chodzi?

public static int AmountOfSubStringsInFileLine(string FileLine, string userInput)
{
    int counter = 0;

    string[] subWords = userInput.Split(' ');

    foreach (var word in subWords)
    {
        if (FileLine.Contains(word))
        {
            counter++;
        }
    }

    return counter;
}
1

@WeiXiao: Wystarczy zrobić tak:

		public static int AmountOfSubStringsInFileLine(string FileLine, string userInput)
        {
            int counter = 0;

            string[] fileLineWords = FileLine.Split(' ');

            foreach (var word in fileLineWords)
            {
                if (userInput.Contains(word))
                {
                    counter++;
                }
            }

            return counter;
        }
0

Ale nie poruszajmy tematu wydajności, jeśli do policzenia wystąpień stringa w strinigu używamy w ogóle metody Split.
Albo piszemy łatwo i wyskopoziomowo i pomagamy sobie Splitem, albo robimy wydajnie.

0

Dziekuje wszystkim za odpowiedzi, bardzo mi pomogliście wszystko działa.

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