» Poradna » Programy

Rozdělení textu na řádky (Programování v libovolném jazyce)

 | Microsoft Windows 10 Chrome 112.0.0.0

Ahoj, přeji pěkně nedělní odpoledne. Mozek mi nějak stávkuje a snažím se programově rozdělit dlouhý text na jednotlivé řádky a nějak mi to nejde. Doufám že mi s tím poradíte.Zadání je takové, že mám rozdělit dlouhý text (třeba 1000 znaků) na jednotlivé řádky. Každý řádek má maximální délku, dejme tomu třeba 30 znaků a mělo by se předejít dělení slov. Tj když řádek má už 25 znaků a následující slovo má 8 znaků, tak ho na současný řádek nedávat, ale dát ho na následující řádek.Současné řešení jsem udělal pomocí regulérního výrazu:.{1,30}( |$)Ten vyhledává 1-30 znaků zakončených mezerou nebo koncem řetězce. Tohle fungovalo dobře na texty typu Lorem Ipsum, kde to spolehlivě rozdělovalo texty na jednotlivé řádky. Avšak střet s uživatelem už to nezvládá. NěkdoMiTamNapsalTakovýhleTextKdeNeudělalŽádnouMezeruTečkuAniČárkuČímžToTotálněRozbil. V tomhle případě to vzalo posledních 30 znaků a ten začátek dlouhého věto-slova to vymazalo, což je zcela nežádoucí stav. Regulární výraz na tohle asi nebude vhodné řešení, ale nějak nevím jak to dělení uchopit a udělat.Potřebuji podobnou funkci, jakou provádí i tohle textové pole do kterého píšu. Jen to musím řešit programově. Jsem si jistý že tohle už je na internetu vymyšleno, ale můj mozek stávkuje a nějak nevím jak pojmenovat to co hledám. Furt mi to nachází jen tvrdé dělení po X znacích, což rozdělí slovo a to nechci.Je jasné že u slova, které je delší než počet znaků na řádku se musí porušit jedno z pravidel. Buď bude řádek delší než těch 30 znaků a nebo dojde k rozdělení slova. Pro moje použití bude lepší ta první varianta. Tedy takovéto věto-slovo dát celé na jeden řádek a holt ten řádek bude mít třeba 50 znaků. Slovo nechat vcelku a nedělit ho.Můžete mě někdo nasměrovat jak tohle řešit? Je mi jedno v jakém to bude jazyce, jestli C#, Java, Python, Regex, nebo i javascript, pro moje použití si to přepíšu.

Mohlo by vás také zajímat

Odpovědi na otázku

 |   |  Microsoft Windows 10 Firefox 112.0

zkus programujte.comjinak bych to asi neřešil regulárním výrazem, ale běžně cyklem a v něm další rozhodovací logikou.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Unknown Mozilla 109.0

Je to jednoduche: 1) rozdel text podle mezer, dostanes seznam slov. 2) Ze seznamu vezmi prvni nepouzite slovo a zacn s nim novy radek. Pridej mezeru. 3) Kdyz je aktualni delka radku plus delka dalsiho slova < 30, pridej dalsi slovo na radek. Pokud ne, zacni dalsi radek 4) vrat se na krok 2)Tohle by melo byt v libovolne jazyce celkem lehke.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Chrome 114.0.0.0

K té libovolnosti, v assembleru bych to dělat nechtěl .

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X AppleMAC-Safari 5.0

A co tak si text cez split rozdelit text na slova. Medzera bude rozdelovac.https://www.w3schools.com/python/ref_string_split.aspA potom si to nejak spocitat kolko textu z listu (slov+medzier) patri na riadok a co uz do dalsieho.Neviem ako ste to robili cez reg vyraz ale aj ten sa da zafixovat^zaciatok$- koniec/w - wordAlebo Word Boundarieshttps://www.regular-expressions.info/wordboundaries.html

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Macintosh OS X AppleMAC-Safari 5.0

\w - word

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Chrome 112.0.0.0

Díky všem za podněty. Já jsem přemýšlel nad variantou, že si najdu 30tý znak a od něj vyhledávám první mezeru směrem vlevo. A když jí nenajdu tak budu hledat na druhou stranu. To by fungovat mohlo, ale přijde mi to jako složité řešení.Ale jak píšete, tak rozdělit text na jednotlivá slova a ty řádky si z těch slov zase poskládat. To je vcelku jednoduché řešení. Já se to furt snažil řešit v jednom kroku a hledat kde to rozdělit. Ale takovéto dvou-krokové řešení je jednoduché a pro moje potřeby použitelné.. Rozdělit to vše a pak si to zase spojovat dohromady. Holt mi mozek dnes stávkuje a jednoduchá řešení mě nenapadají. Díky všem za nápady.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 114.0.0.0

Ještě tam je taková drobnost, když je mezi slovy 5 mezer, tak mají zůstat ??? nebo se mají nahradit 1 mezerou ???

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Chrome 112.0.0.0

Lepší bude když vícenásobné mezery zůstanou. Ale asi nebude velký problém když dojde k jejich sloučení do jedné mezery. Případně pokud mezery vyjdou na konec nebo začátek řádku, tak tam je zcela jedno jestli půjdou pryč.

Souhlasím  |  Nesouhlasím  |  Odpovědět
avatar
 | Microsoft Windows 10 Chrome 114.0.0.0

Já osobně bych to dělení 31+ znakových slov nechal na uživateli = pokud je v textu delší slovo než 30 znakové tak nepovolit vložení textu a uživatel to slovo rozdělí tak jak uzná za vhodné.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Firefox 114.0

Mne napadlo ako prve presne to iste. najst 30ty znak a dolava hladat medzeru. Pripadne tam dat este jednu podmienku, ze ak medzera nie je do -10 znakov, tak to proste sekni na tom 30tom.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Android Chrome 114.0

Nechápu proč regex , stačí for... ale když ti stávkuje mozek, stačí to napsat do chatgpt nebo Copilota...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Android Chrome 110.0

Kdysi se pro algoritmy řešila i složitost. Proč to řešit algoritmem s O(n) - s jedním cyklem a s několika countery, když to lze naprogramovat složitěji (ideálně s několika regexpy a dalšími cykly)... "Zdroje jsou."

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Linux Firefox 114.0

Kdyby to někdo řešil, tak JavaScriptu se to dá s regexem udělat takto.O dost čitelnější je ta první forma, ale rozhodně to ještě není ta možnost, která je nejdelší.const retezec = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Nullam feugiat, turpis at pulvinar vulputate, erat libero tristique tellus, nec bibendum odio risus sit amet ante. Etiam quis quam. Etiam bibendum elit eget erat. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Maecenas fermentum, sem in pharetra pellentesque, velit turpis volutpat ante, in pharetra metus odio a lectus. Maecenas sollicitudin. Nullam sit amet magna in magna gravida vehicula. Nullam at arcu a est sollicitudin euismod. Vestibulum fermentum tortor id mi. Fusce suscipit libero eget elit. Etiam ligula pede, sagittis quis, interdum ultricies, scelerisque eu. Nunc auctor. Etiam quis quam. Integer rutrum, orci vestibulum ullamcorper ultricies, lacus quam ultricies odio, vitae placerat pede sem sit amet enim. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Fusce suscipit libero eget elit. Pellentesque arcu. Nam quis nulla. In enim a arcu imperdiet malesuada. Quisque porta. In rutrum. Donec ipsum massa, ullamcorper in, auctor et, scelerisque sed, est. Etiam commodo dui eget wisi. Nullam lectus justo, vulputate eget mollis sed, tempor sed magna. Etiam neque. Curabitur vitae diam non enim vestibulum interdum. Duis bibendum, lectus ut viverra rhoncus, dolor nunc faucibus libero, eget facilisis enim ipsum id lacus. Mauris elementum mauris vitae tortor. Quisque tincidunt scelerisque libero. Pellentesque ipsum. Nunc tincidunt ante vitae massa. Donec ipsum massa, ullamcorper in, auctor et, scelerisque sed, est. Duis pulvinar. Nullam lectus justo, vulputate eget mollis sed, tempor Ukázat celý příspěvek

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Chrome 114.0.0.0

Kdybys chtěl, aby tvůj příspěvek bral někdo vážně, tak použiješ https://pastebin.com/

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 114.0.0.0

Asi bych vyřešil, tak že bych našel místa, kde lze text dělit, jedná se hlavně o mezery, ale pozor na slova, co nemohou být na konci řádku (v českém písmu jednoznaké předložky, čísla s mezerou 10 000=10000, atd.) A místa mezi slabiky... Uložit tyto částečky do nějakého pole, kde s třídou asi se string (text částecky) pak boolean (info zda následuje dělení se spojevníkem). Každou částečku změříš (podle fontu). A nakonec projedeš cyklem kolik částeček se vleze na řádek, aplikuješ-neaplikuješ spojovník dle podlední částečky.

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: Mozek, Nargon, Řádek, Dělení, Dlouhý text, Slovo, První varianta, Střet, Následující řádek, Textové pole, Současné řešení, Počet znaků, Regulární výraz, Vhodné řešení