dodawanie tekstu do pliku

Odpowiedz Nowy wątek
2019-03-15 09:36
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.

Pozostało 580 znaków

2019-03-15 09:50
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.

Pozostało 580 znaków

2019-03-15 10:02
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.

Pozostało 580 znaków

2019-03-15 10:42
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?

Pozostało 580 znaków

2019-03-15 10:46
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 ?

Pozostało 580 znaków

2019-03-15 10:52
ŁF
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();

edytowany 1x, ostatnio: ŁF, 2019-03-15 10:52

Pozostało 580 znaków

2019-03-15 11:23
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.

A to dużo wyjaśniłeś, "oznaczyć pozycję zdania w sekwencji zdań". Mam ją obsikać? - ŁF 2019-03-15 11:33
kurde po co te nerwy.. demn. wiesz co pomiń to nie było punktu 4. sam sobie jakoś poradzę - Mariusz Liszewski 2019-03-15 11:35
Żadne nerwy, raczej żart z tego, że trzy razy pytany o doprecyzowanie tej kwestii nie zrobiłeś tego. - ŁF 2019-03-15 11:46

Pozostało 580 znaków

2019-03-15 11:47
ŁF
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.


Pozostało 580 znaków

2019-03-15 13:02
0

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

Dobre spostrzeżenie. Nie pomyślałem o tym - Mariusz Liszewski 2019-03-15 13:38

Pozostało 580 znaków

2019-03-15 14:15
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

edytowany 1x, ostatnio: Sarrus, 2019-03-15 14:17

Pozostało 580 znaków

2019-03-15 15:15
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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