dodawanie tekstu do pliku

dodawanie tekstu do pliku
Mariusz Liszewski
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:27
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.

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
  • Postów:2512
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.

Mariusz Liszewski
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:27
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.

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
  • Postów:2512
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?

Mariusz Liszewski
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:27
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 ?

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:5 minut
0

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

Kopiuj
            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:

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

Jeśli chcesz od razu wypisać wyniki:

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

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

Kopiuj
            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
Mariusz Liszewski
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:27
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.

ŁF
A to dużo wyjaśniłeś, "oznaczyć pozycję zdania w sekwencji zdań". Mam ją obsikać?
Mariusz Liszewski
kurde po co te nerwy.. demn. wiesz co pomiń to nie było punktu 4. sam sobie jakoś poradzę
ŁF
Żadne nerwy, raczej żart z tego, że trzy razy pytany o doprecyzowanie tej kwestii nie zrobiłeś tego.
ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:5 minut
1
Kopiuj
            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.


Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
  • Postów:2512
0

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

Mariusz Liszewski
Dobre spostrzeżenie. Nie pomyślałem o tym
Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
  • Postów:2512
0

Spróbuj coś takiego:

Kopiuj
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
Mariusz Liszewski
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:27
0

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

Mariusz Liszewski
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:27
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

Mariusz Liszewski
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 5 lat
  • Postów:27
0

Indeksowaniem w stylu 1) zdanie 2) zdanie itp

ŁF
Przecież już Ci to zrobiłem. Jeśli nie rozumiesz rozwiązania, to zapytaj o konkretne jego części.
WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 16 godzin
  • Postów:5122
0

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

DY
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:75
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.

Kopiuj
            // 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;
            }
Sarrus
Czytałeś cały temat? Znów tu jest ten sam problem, że z pytań robisz zdania oznajmujące.
DY
Dobra uwaga, umknęło mi to, dzięki.
AR
  • Rejestracja:ponad 14 lat
  • Ostatnio:ponad rok
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

Sarrus
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 2 godziny
  • Postów:2512
0
Sarrus napisał(a):

Spróbuj coś takiego:

Kopiuj
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

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)