dodawanie tekstu do pliku

0

Witam potrzebuję pomocy.
Głównie chodzi o to że mój program ma za zadanie czytać duży blok tekstu, rozdzielać go na poszczególne zdania i te zdania dzielić na części indeksując go od 1 do 10. I tutaj jest moje pytanie, jak to zrobić... Na pewno jest gdzieś to w internecie ale nie mogę tego znaleźć.
I druga część problemu: Jak po każdym wypisaniu zdani (Z podzielonego pliku) na końcu dodać kropkę. Zrobić to jakoś w pętli ?
Za wszelkie odpowiedzi byłbym bardzo wdzięczny.

0

Podziel problem na części:

  1. Wczytać plik
  2. Podzielić na zdania
  3. Dodać kropkę
  4. Zaindeksować

Nie wiem na czym polegać ma ta indeksacja, ani na czym polega wypisywanie.

Widzę tu jednak pewien problem. Jak rozpoznać zdanie, skoro na końcu nie ma kropki? Twym zadaniem wszak jest tą kropkę dodać. Drugim problemem zapewne jest wielkość pliku. Jeżeli jest on na prawdę duży, to nie możesz go wczytać w całości. Masz dwa wyjścia, albo wczytujesz blokami, albo wciągasz jako strumień. Trochę mało informacji - przydałby się jakiś przykład dane wejściowe -> dane wyjściowe.

0

Już uzupełniam informacje, bo faktycznie nie podałem kilku znaczących informacji... Więc tak plik wczytuję w całości (nie otwierając go w konsoli) dzielę na zdania (W pliku z tekstem są kropki i właśnie po nich je dziele, tylko po splicie kropki zostają usunięte) a indeksowanie ma polegać na tym że początek to 1 środek 5 i koniec 10.

0

A co z wykrzyknikami i znakami zapytania?

a indeksowanie ma polegać na tym że początek to 1 środek 5 i koniec 10.

Możesz podać jakiś przykład?

0

jest pewien artykuł "...Netflix testuje podwyżki w Polsce. Ceny abonamentów. Śledzik u premiera i 1000 zł. Odpowiedzialność podatkowa osób trzecich. Obowiązki środowiskowe przedsiębiorców. -entERo- Przeczytaj też Ponad jedna czwarta uprawnionych złożyła wnioski o 10-tysięczne rekompensaty za utracony węgiel Petru Zgłoszę poprawkę, aby 500+ nie trafiało do najbogatszych Netflix testuje podwyżki w Polsce. Ceny abonamentów nawet o kilkanaście złotych w górę W niedzielę sklepy będą zamknięte -entERo- Najpopularniejsze Idą ciężkie czasy dla wynajmujących?... "

do dzielenia na pojedyncze zdania użyłem
string[] words = textFromFile.Split(new string[] { ". " , "? " , "! " }, StringSplitOptions.None);
teraz chcę wypisać każdą pojedynczą linie i na końcu dodać kropkę. użyć do tego pętli foreach czy jakoś inaczej ?

0

Mało optymalna wersja, do dalszych Twoich przemyśleń (np. string.Join albo StringBuilder zamiast Aggregate):

            var text = File.ReadAllText(pathToYourTextFile)
                .Split('.')
                .Select((t, i) => $"{i}) {t}.")
                .Aggregate((current, next) => current + next);

"Indeksowanie" objaśniłeś w taki sposób, że nadal nic nie wiadomo, więc uznałem, że to dodanie numerku z nawiasem przed każdym kolejnym elementem. Jeśli chcesz tylko załadować do tablicy/listy, to problem robi się jeszcze prostszy:

            var lines = File.ReadAllText(pathToYourTextFile)
                .Split('.')
                .Select(t => t + '.')
                .ToList();

Jeśli chcesz od razu wypisać wyniki:

            File.ReadAllText(pathToYourTextFile)
                .Split('.')
                .ToList()
                .ForEach(t => Console.WriteLine(t + '.'));

Wypisanie z jednoczesnym zwróceniem danych (łamie SRP, wiec raczej traktuj to jako ciekawostkę)

            var text = File.ReadAllText(pathToYourTextFile)
                .Split('.')
                .Select(t => { var s = t + '.';  Console.WriteLine(s); return s; })
                .Aggregate((current, next) => current + next);
                .ToList();
0

No tak. Tylko mechanizm tego programu ma polegać na :
1.Czytanie tekstu z pliku
2.Dzielenie pliku na zdania po ". " lub "? " (znak + spacja)
3.Dodawanie kropki
4.Oznaczyć pozycję zdania w sekwencji zdań
5.Zapis do nowego pliku
Nie trzeba niczego wyświetlać w Consoli.

1
            File.WriteAllText(
                "outputPath",
                File.ReadAllText("inputPath")
                    .Split(new[] { ". ", "? " }, StringSplitOptions.RemoveEmptyEntries)
                    .Select((t, i) => $"{i}) {t}.")
            );

Żeby zmusić Cię do jakiegokolwiek wysiłku usunąłem jedną linijkę rozwiązania, ale masz ją już we wcześniejszych przykładach.

0

No ale jak usuniesz ? i potem dodasz . to będzie dobrze?

0

Spróbuj coś takiego:

List<string> GetSentences(string input)
{
    var regex = new Regex(".*?[\\.!?]");
    var match = regex.Match(input);
    var list = new List<string>();
    while (match.Success)
    {
        var value = match.Value.Trim();
        if (value != string.Empty)
            list.Add(value);
        match = match.NextMatch();
    }
    return list;
}

I nie odpowiadaj na temat w komentarzach bo potem ciężko się połapać. Komentarze są do offtopu

0

Ok i ja jakiej zasadzie to działa? Żebym bezmyślnie nie przepisywał bo to się mija z celem.

0

A co do numerowania zdań chodziło o to że jest kilka artykułów odseparowanych numerami bądź kilkoma odstępami "spacją" to już do wyboru. I jak zrobić żeby zdania numerowalo tylko do końca danego artykułu a od następnego się żerowalo? Jakaś podpowiedź była by idealna

0

Indeksowaniem w stylu 1) zdanie 2) zdanie itp

0

Wrzuć przykładowy tekst i pokaż jak to ma wyglądać na wyjściu.

0

Witam jako nowy na forum.

Z tego co czytam, to masz kilka artykułów odseparowanych "czymś".
Więc pierw rozbij tekst na artykuły, a dopiero potem artykuły na zdania.
Kod poglądowy (nie testowałem), dla uproszczenia na pętlach.

            // Twój plik.
            string wczytanyTekst = "";
            // Zastanów się czym oddzielone są artykuły? Czy jest to unikalne? Bo taki split to może być za mało.
            string separatorArtykulow = "separator";
            // Napisałeś, że masz parę artykułów, więc zacznij od podzielenia tekstu na te artykuły.
            string[] artykuly = wczytanyTekst.Split(new string[] {separatorArtykulow}, StringSplitOptions.None);
            string[] zdaniaArtykulu;
            int numerZdania = 1;
            string indeks;
            string wyjscie = "";
            // Iterujemy po artykułach, żeby móc sobie w obrębie jednego numerować łatwo zdania.
            foreach (var artykul in artykuly)
            {
                // Ale musimy mieć te zdania, więc ten jeden artykuł dzielimy na nie.
                zdaniaArtykulu = artykul.Split(new string[] { ". ", "? ", "! " }, StringSplitOptions.None);
                foreach (var zdanie in zdaniaArtykulu)
                {
                    indeks = numerZdania.ToString() + ")";
                    wyjscie += indeks + zdanie + ". ";
                    numerZdania++;
                }
                // Każdy artykuł ma być od początku numerowany, więc resetujemy licznik.
                numerZdania = 1;
            }
0

Może wczytaj cały tekst do jednej listy - będziesz miał odniesienie
nastepnie do każdej z list wczytaj osobno zdania z kropką, zdania z pytajnikiem z wykrzyknikiem
Wyświetlaj w kolejności jakie są w liście odniesienia zdania z list z pytajnikiem lub kropką itp

ewentualnie stwórz dictionary
i w dictionary zapisz znaki jakie są dla każdego zdania
oczywiście dictionary będziesz musiał posortować po kolejności zdań, które masz w liście takiej jak na początku mojej wypowiedzi czyli odniesienia

0
Sarrus napisał(a):

Spróbuj coś takiego:

List<string> GetSentences(string input)
{
    var regex = new Regex(".*?[\\.!?]");
    var match = regex.Match(input);
    var list = new List<string>();
    while (match.Success)
    {
        var value = match.Value.Trim();
        if (value != string.Empty)
            list.Add(value);
        match = match.NextMatch();
    }
    return list;
}

I nie odpowiadaj na temat w komentarzach bo potem ciężko się połapać. Komentarze są do offtopu

Mariusz Liszewski napisał(a):

Ok i ja jakiej zasadzie to działa? Żebym bezmyślnie nie przepisywał bo to się mija z celem.

To wykorzystuje wyrażenie regularne. W skrócie przy każdym przejściu pętli brane jest wszystko do wystąpienia znaku ., ? lub !. Każde niepuste zdanie dodawane jest do listy.
Widać jednak tutaj wadę, że gdy będą wyjątki typu ?! lub ... to będziesz miał zdania z samym pytajnikiem, albo samymi kropkami. Ten problem zostawiam jako zadanie domowe.

Jeżeli nie chcesz używać wyrażeń regularnych, możesz jeszcze użyć metod String.IndexOf oraz String.Substring

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