Fórum Root.cz

Hlavní témata => Software => Téma založeno: honzik1111 10. 09. 2021, 09:54:15

Název: GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 10. 09. 2021, 09:54:15
Mám dva podobné textové soubory, které se drobně liší, a potřebuji je sloučit.
Existuje nějaký grafický nástroj, kde by se snadno a rychle mohlo odkliknout, kterou změnu/rozdíl přijmout či odmítnout?
Ideálně ještě s možností snadné editace?
Na jednom řádku může být víc změn, cílem je mít možnost „odkliknout“ každou změnu zvlášť, „po slovech“ (tedy ne celý řádek).
Nástroj může být online nebo GUI (asi i TUI kdyby dobře fungoval). Kdyžtak ideálně multiplatformní.
Bylo by to pro obyčejné PC uživatele („BFU“).

Textové soubory jsou převážně souvislejší text, doplněný o různé značky, něco jako markdown. Obvykle velikosti vyšších desítek až stovek řádků.
Změny jsou důsledkem korektur, není předpoklad drastických rozdílů.

Zkoušel jsem různé GUI pro git, ty umí změny hezky zvýraznit a umožňují snadno pracovat s celými řádky.
Ale nenašel jsem nic, kde by se změny daly přijímat/odmítat „po slovech“.
Taktéž Libreoffice umožňuje "Edit->Track Changes->Compare document", ale dělení změn je příliš hrubé a nevyhovující (obvykle celé řádky).

Příklad:
soubor1.txt
Kód: [Vybrat]
lorem ipsum dolor sit amet,
consectetur adipisici elit,
sed eiusmod incidunt
ut labore et dolore aliqua

soubor2.txt
Kód: [Vybrat]
Lorem ipsum Dolor sit Amet,
# komenář komentář komentář
consectetur *adipisici* **elit**,
sed tempor incidunt
ut et dolore magna aliqua.

diff (zhruba nějak podobně si představuji zobrazení v GUI, jen barevné odlišení místo stylu písma):
Citace
loremLorem ipsum dolorDolor sit ametAmet,
# komenář komentář komentář
consectetur *adipisici* **elit**,
sed eiusmodtempor incidunt
ut labore et dolore magna aliqua.

vysledek.txt (požadovaný výsledek po editaci)
Kód: [Vybrat]
Lorem ipsum dolor sit amet,
# komenář komentář komentář
consectetur *adipisici* elit,
sed eiusmod tempor incidunt
ut labore et dolore magna aliqua.

Můj dosavadní přístup, pro zajímavost, kdyby se to někomu hodilo. Mě naprosto vyhovující, avšak nepřenositelný pro BFU:
změny vygeneruji příkazem
Kód: [Vybrat]
git diff --color-words='\w+|\S' soubor1.txt soubor2.txt > diff.txtSoubor diff.txt obsahuje ascii escape sekvence pro xterm barvy.
Otevřu v (g)vimu, mám vlastní plugin, který dle ascii escape znaků obarví změny a dále definuje klávesové zkratky pro skok na další změnu, přijetí změny a odmítnutí změny.
Pracuje se s tím velmi rychle a pohodlně.

Avšak pro BFU bych potřeboval něco „jednoduššího“.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Ondřej Kolín 10. 09. 2021, 09:59:36
Meld, dostupny v repozitarich, pripadne na flathubu.

https://ctrlv.cz/shots/2021/09/10/mqoy.png
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 10. 09. 2021, 12:50:26
Meld
Děkuji za tip.
Ve výchozím nastavení mi ale celý obsah souboru označuje jako jednu změnu. Lze nějak meld přimět, aby dělal rozdíly „po slovech“?
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Ondrej Nemecek 10. 09. 2021, 13:02:14
Pokud vidíte jako změnu celý soubor, je asi problém s koncem řádků nebo s bílýmy znaky. Nejlepší bude poslat ukázkové soubory.

Meld může ignorovat bílé znaky a rozdílné konce řádků, ale i když zobrazuje změny po slovech, tak IMHO provádí merge po řádcích. Jinak hledejte diff gui nebo diff and merge gui , možná že některé nástroje umí pracovat se slovy (což není v programování tak běžné, tam jde typicky minimálně o celé řádky).
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 10. 09. 2021, 14:10:41
Změny vidím zvýrazněné, tak jak bych si to představoval.
Ale sloučení se provede jako celek.
Přesně jako na obrázku od Ondřeje Kolína.
Ukázkové soubory jsou v OP, přikládám i přímo ke stažení.
https://drive.google.com/file/d/1PD2ViPi-NemPn_sQ3mzQZ62PeSpyTw0H/view?usp=sharing
https://drive.google.com/file/d/1_gFGEZ7p9JVGO8Osu35HYBBbHoZFUFEF/view?usp=sharing
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: _Jenda 10. 09. 2021, 17:54:26
v kdiff3 jde udělat u každé změny split až na úroveň řádků, po slovech to bohužel neumí. A přešel jsem z něj na meld protože kdiff3 má matoucí GUI (je snadné přehlédnout nějakou malou změnu). Po slovech nevím že by něco umělo.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Death Walker 10. 09. 2021, 19:04:46
meld, kdiff3, kompare, diffuse - kazdy urobi zhruba rovnaku sluzbu, ktore pouzit je skor na preferenciach uzivatela. Ak ide o pc na ktorom su widle tak by som pozrel este na winmerge...
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Ondrej Nemecek 10. 09. 2021, 21:41:38
meld, kdiff3, kompare, diffuse - kazdy urobi zhruba rovnaku sluzbu, ktore pouzit je skor na preferenciach uzivatela. Ak ide o pc na ktorom su widle tak by som pozrel este na winmerge...

Chce merge po slovech...
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Death Walker 10. 09. 2021, 23:00:32
Aha, takze asi chce nieco uplne ineho ako o com tu tocime.

Na to staci Libre office a v menu Subor -> Verzie...  Malymakky Slovo by to mal vediet tiez...

Vysledok:

https://i.imgur.com/yi5gQ01.png
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 11. 09. 2021, 11:52:40
Ano, hledám nástroj pro merge „po slovech“. Mít možnost rozhdnout každou nezávislou změnu zvlášť.
Nezávislá = oddělená nezměněným textem.
Například v OP v prvním řádku mít možnost nezávisle rozhodnout každé ze tří velkých/malých písmen.

S celými řádky samozřejmě není problém, tam toho existuje hodně.

Na to staci Libre office a v menu Subor -> Verzie...
Bohužel nestačí:
Taktéž Libreoffice umožňuje "Edit->Track Changes->Compare document", ale dělení změn je příliš hrubé a nevyhovující (obvykle celé řádky).
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Ondrej Nemecek 11. 09. 2021, 13:35:36
To chce asi zalovit ve vodách redakčního software - poptat překladatele, redaktory, korektory apod.

Nebo ten již existující postup s vimem obalit nějakým uživatelským zpřátelštěním, možná by to byl nejpřímočařejší postup.

Z hlediska programování IMHO jde jen o změnu tokenizéru - v diff algoritmu použít místo nového řádku bílé znaky. Trochu to komplikuje požadavek zobrazit texty obou verzí v původní podobě po řádcích, ale asi byl nebyl problém použít reference do původního textu. Samotného mne ale překvapilo, že všechny programátorské diff nástroje jedou striktně řádky (když obarvují i slova).
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Death Walker 11. 09. 2021, 20:11:41
Samotného mne ale překvapilo, že všechny programátorské diff nástroje jedou striktně řádky (když obarvují i slova).

Pretoze by sa stavalo ze pri nevhodnom pojmenovani premennych, funkcii a pod v kombinacii s blbcom a typovo slabym jazykom, by vysledkom merge mohlo byt nieco ako:
Kód: [Vybrat]
auticka = jablcka + tehly;
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Ondrej Nemecek 11. 09. 2021, 21:54:10
Blbej merge uděláš i teď. IMHO proto existují pokusy o sémantický merge apod.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: ludva.eth 14. 09. 2021, 00:56:58
SmartSynchronize (placený) umí i merge označeného textu, takže i po slovech.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: oss 14. 09. 2021, 07:25:05
WinMerge asi najlepsi mergovaci tool aky som kedy videl.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Death Walker 14. 09. 2021, 07:37:27
WinMerge asi najlepsi mergovaci tool aky som kedy videl.

V pipade ze si odkazany na widle tak hej...
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: premekv 14. 09. 2021, 09:11:03
Řešil jsem podobnou věc jako autor dotazu a další.

- porovnávání/mergování "po slovech" (konkrétně třeba values v .csv souboru)

- mít možnost u "třícestného merge" zapnout/vypnout zobrazení levého, středního, pravého sloupce (tj ukázat jen přidané věci, jen odebrané věci a jen změněné věci, s nějakým summary info, kolik toho je). Winmerge např. při diffování dvou adresářů nabídne toggle buttony "left only" "right only" "not equal only"... ale při diffování dvou souborů ne.

- semantické porovnávání u json/yaml - např. na pořadí atributů nezáleží (příp. ještě - a to už je vyšší dívčí - na pořadí prvků pole nezáleží, identifikují se např. pomocí id atributu; a to vše rekurzivně, zajímají mne i vnořené objekty a pole)

Vždy jsem toho nějak docílil s CLI (comm, diff, jq...) nebo stávajícími tooly (na ty jsony mi velmi často jenom je sesortovat a porovnat textově, ale ne vždy, někdy posloužil excel, ..), v nejhorším jsem si napsal skriptík v bash/pythonu, ale nějaký GUI tool, který by měl takovéto pokročilé vlastnosti, postrádám. Zkoušel jsem i různé online tooly a nebylo to úplně ono (nehledě na to, že někdy content může být potenciálně citlivý a nerad to odesílám na cizí server). Chci offline tool. "Mezera na trhu"?
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 15. 09. 2021, 10:19:45
SmartSynchronize (placený) umí i merge označeného textu, takže i po slovech.

Děkuji za tip. Vyzkoušel jsem v rámci zkušební doby zdarma.
Označený text to umí přiřadit doleva-doprava, čili zhruba to co bych potřeboval. Nicméně:
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Ondrej Nemecek 15. 09. 2021, 10:39:35
SmartSynchronize (placený) umí i merge označeného textu, takže i po slovech.

Děkuji za tip. Vyzkoušel jsem v rámci zkušební doby zdarma.
Označený text to umí přiřadit doleva-doprava, čili zhruba to co bych potřeboval. Nicméně:
  • pro přijetí/odmítnutí změny je nutné označit text, pravé tlačítko myši, kliknout na správnou položku. Chtěl jsem ještě něco pohodlnějšího :-)
  • Špatně funguje undo/redo (nejen v tom režimu "po slovech")
  • Občas nejde pracovat s označením, ale je možnost jen "apply inner-line difference", tedy zase jen celý řádek..

Já bych uživateli nabídl řešení postavené nad tím vimem nebo mu napsal custom řešení. V případě, že změny jsou v obou souborech vždy na stejném tj. odpovídajícím řádku, by to nemělo být tak složité. Šipkama nahoru/dolu by se posouvalo mezi řádkama, šipkama doprava/doleva by se posouvalo mezi změnama a třeba ALT+R/ALT+L by uživatel akceptoval verzi vlevo nebo vpravo. Plus tlačítko na načtení souboru doleva, tlačítko načtení souboru doprava a tlačítko na uložení výsledného merge.

V implementaci by se při posunu na příslušný řádek tento rozdělil na více řádků po slovech a pak použil třeba tradiční diff algoritmus, nakonec by se řádek zase spojil zpět. Kontext porovnávání by tedy byl omezen na řádky stejného čísla v levém i v pravém souboru (první řádek vůči prvnímu, druhý řádek vůči druhému atd.). Možná to je trochu naivní představa a v praxi by měla nedokonalosti, ale princip by mohl sedět.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Kit 15. 09. 2021, 11:05:19
Vimdiff
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 15. 09. 2021, 17:09:20
"Mezera na trhu"?
Nový nástroj je samozřejmě možnost, jen mě zajímalo, zda již neexistuje něco co někdo používá / zná, ale co jsem nebyl schopen vyhledat.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 15. 09. 2021, 17:11:28
WinMerge asi najlepsi mergovaci tool aky som kedy videl.
Zkoušel jsem s wine, tam mě zatím WinMerge nepřesvědčil. Možná mu dám ještě možnost s oprášeným virtualboxem.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 15. 09. 2021, 17:52:39
Vimdiff
Nějaké tipy pro nastavení nebo používání, aby dělal to, co je popsáno v OP?
Ve výchozím nastavení nezobrazuje jednotlivé změny, ale skoro celý řádek.
Na to jsem našel plugin https://github.com/rickhowe/diffchar.vim (https://github.com/rickhowe/diffchar.vim), který to o něco vylepšuje, ale třeba řádek # komenář ... nevyhodnotí jako jednotlivou změnu a všechny řádky po něm už "rozhází"...
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 15. 09. 2021, 17:55:18
Nový nástroj je samozřejmě možnost, jen mě zajímalo, zda již neexistuje něco co někdo používá / zná, ale co jsem nebyl schopen vyhledat.
Přesto děkuji za podněty a nápady, možná se k nim časem dostanu
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 22. 09. 2021, 01:04:25
Tak jsem si nakonec vyrobil vlasntí udělátko, pro prohlížeč, přesně dle vlastních požadavků :-)
Kdyby to někoho zajímalo:
"webová aplikace" (https://stranskyjan.gitlab.io/word-by-word-merge-gui/)
demo gif (https://gitlab.com/stranskyjan/word-by-word-merge-gui/-/raw/main/demo.gif/)
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: Ondrej Nemecek 22. 09. 2021, 08:46:27
Hezké, jednoduché  :D
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: radioing 22. 09. 2021, 14:10:02
Moc pekne. Co takhle jeste spojit Accept/Reject s Nextem kvuli usetreni klikani?
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: honzik1111 23. 09. 2021, 10:59:52
Spojit Accept/Reject s Nextem by nebyl problém.

Lze ale použít klávesové zkratky (osobně mnohem více preferuji klávesové zkratky než klikání), takže spojení by zas tolik neušetřilo. Nyní se navíc po "next" označí, co se případně přijímá/odmítá.
Název: Re:GUI pro slučování podobných textových souborů
Přispěvatel: mikesznovu 23. 09. 2021, 18:02:46
Mám podobný provlém , akorát že těch souborů je 7. Mají 400 až 3000 řádků, někde záznam je tvořen 2 řádky ( komentář).


Soubory jsou jako vzasadě jako append , pokud se ručně nemění(což ale se děje kvuli drobnym upravam). Vetsinou jsou vzaté z nějakého předchozího  a tudiž některé nohou mít společnou historii . ale byly zkopirovany na ruzna zarizeni v ruzny cas a vyvijely se vlastnim zivoten (append a obcasne editace, korekkce) a je běžné že do stejná věc se mohla do  dostat do vice souboru (mozna v s.nejakou odchylkou)


Zaznam je vzdy dvojice radku, kdy prvni je comment a druhy samotny record. Ovsem pri vlozebi "stejneho zaznamu" se muze cast komentu mirne lisit. Dokonce se muze mirne lisit i samotny record .


Mohou tam být ručni odchylky ( odmazaný řadek veprostřed, zakomentovany ci upraveny)

Tool by byměl nějak schopn být umět znát syntaxi a "normalizovat řádky" (např. "/*" u jednoho ne ano , nebo část za nějakym znakem co se vyskytuje jen jednou)


Cílem je všechny soubory agregovat do jednoho.