Jak sloučit soubory?

...

Moderátor: Mods_senior

_hm
nováček
Příspěvky: 26
Registrován: 09 črc 2020 10:22

Re: Jak sloučit soubory?

Příspěvek od _hm »

No, jo, ale to jsi měl napsat hned, že první je tabulátor a pak může být slov víc s mezerami.
Dalo by se to upravit změnou oddělovače ve splitu (viz kód níže), ale pak se zdá, že je potřeba doplnit před ten řádek ještě chomp (viz tamtéž). (Obojí je tam dvakrát.)
Ačkoliv teď mě napadá, že se možná chomp doplňovat nemusel a mohlo se vynechat odřádkování ve výstupním printu. Bylo by to ještě kratší. :-) Ale už jsem tam prdnul ten chomp, tak ...

Přesměrování do výstupního souboru: jestli ten program voláš normálně nějak

Kód: Vybrat vše

program.pl en.txt cz.txt
, tak to stačí jen doplnit na

Kód: Vybrat vše

program.pl en.txt cz.txt > vystup.txt
Jestli to chceš fakt přímo do programu, tak to dáme třeba jako třetí parametr.
Takže výsledný kód s tabulátorem a překladem s možností mezer a s výstupem do souboru, který se uvede jako třetí parametr, je:

Kód: Vybrat vše

#!/usr/bin/perl -w

if ($#ARGV != 2) {
   print "\nNejsou zadány soubory.";
   print "\nProgram je nutné spustit se třemi parametry: ";
   print " anglický_soubor český_soubor výstup\n";
   exit 0;}

my (%hVysl);
open (Anglicky, $ARGV[0]);
foreach my $Radek (<Anglicky>) {
   chomp $Radek;
   my @Slova = split ("\t", $Radek);
   $hVysl{$Slova[0]} = $Slova[1];}
close (Anglicky);
open (Cesky, $ARGV[1]);
foreach my $Radek (<Cesky>) {
   chomp $Radek;
   my @Slova = split ("\t", $Radek);
   $hVysl{$Slova[0]} = $Slova[1];}
close (Cesky);
open (Vystup, '>', $ARGV[2]);
foreach my $Klic (sort (keys %hVysl)) {
   print Vystup $Klic . ' ' . $hVysl{$Klic} . "\n";}
close (Vystup);
Doufám, že se při tom kopírování nic nepokazilo.


Po EDITu 2:
A nevymýšlíš si už trochu?
Asi třeba nějak takhle (jen upravená část - český cyklus)

Kód: Vybrat vše

open (Cesky, $ARGV[1]);
foreach my $Radek (<Cesky>) {
   chomp $Radek;
   my @Slova = split ("\t", $Radek);
   if (defined ($hVysl{$Slova[0]})) {
      $hVysl{$Slova[0]} = $Slova[1];}}
close (Cesky);
flowem
Level 5.5
Level 5.5
Příspěvky: 2858
Registrován: 09 bře 2013 15:41

Re: Jak sloučit soubory?

Příspěvek od flowem »

Vypadá to, že takhle je to úplně dobrý, díky ti moc. :-)
AMD Ryzen 5 5600X | MSI MAG B550 TOMAHAWK | G.Skill Aegis 32GB 3200MHz | Kingston A2000 1TB | PowerColor Red Devil RX 6700 XT 12GB | XPG Core Reactor 750W | Be quiet! PURE BASE 500 | Asus VG27AQ1A
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7404
Registrován: 23 pro 2010 09:23

Re: Jak sloučit soubory?

Příspěvek od faraon »

flowem píše:A pak je vždy mezera (TAB)...
Tabulátor není mezera, to je úplně jiný znak! V ASCII #9 a #32 :evil:

A kdybys to řekl rovnou, nebo dodal pár testovacích souborů, tak by to bylo mnohem jednodušší.

Takže jestli sis už nainstaloval DOSBox, můžeš si vybrat z několika oddělovačů, zda nenalezené výrazy přidat nebo ne, a jestli výsledek řadit. Ale teď už to pomalu přestává být jednoduchý prográmek:
PREKRYV2.ZIP
(30.6 KiB) Staženo 69 x
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)
Uziv00

Re: Jak sloučit soubory?

Příspěvek od Uziv00 »

Jsem to psal hned, ať ty soubory dodá. Napsal bych mu to ve vbs bez nutnosti dalších instalací. Takhle je ku ničemu...
Skriptů už tu mám požehnaně.
Takové jako jednou je to tak a pak to tak není je jaksi k ničemu.

Dodatečně přidáno po 5 hodinách 37 minutách 54 vteřinách:
Tak taky něco přihodím :-)
Vzorové soubory:

Kód: Vybrat vše

APPLE   Apple
ORANGE   Orange
BLUE   Blue
THIS_IS_ THE_FIRST This is the first

Kód: Vybrat vše

APPLE   Jablko
APPLE_2   Jablko2
ORANGE   Pomeranč
APRICOT Meruňka
THIS_IS_ THE_FIRST Tohle je první
Výsledek:

Kód: Vybrat vše

APPLE   Jablko
APPLE_2   Jablko2
ORANGE   Pomeranč
THIS_IS_ THE_FIRST Tohle je první
APRICOT Meruňka
Skript je napsaán ve visual basicu - postačí si kód zkopírovat do notepadu a uložit s příponou .vbs. Spustit poklepáním.

Kód: Vybrat vše

'*****************************************************
'*         Skript projde textové soubory             *
'*     Vyhledá anglický text v cze souboru,          *
'*   pokud ho najde, vypíše řádek cze souboru        *
'* Prohledáváné soubory musí být ve stejném adresáři *
'*              Výstup sloucit.txt                   *
'*                                                   *
'*            Vytvořeno pro PC-HELP                  *
'*             Etienn@Script v 1.0                   *
'*****************************************************

Option Explicit
Dim path, fso, srce, srccz, cilFile, txtStreame, txtStreamcz, txtStream2, txtStreamsl, signal
Dim Text, slovoe, i, slovocz, radek, znak, linka, txtSreamsl, linecz(), slouceny ()
ReDim linecz(100)
ReDim slouceny(150)


' zjisteni cesty ke skriptu
path = WScript.ScriptFullName
path = Left(path, InStrRev(path, "\"))

' vytvoreni objektu pro pristup k souborum
Set fso = CreateObject("Scripting.FileSystemObject")
srce = path & "eng.txt"
srccz = path & "cze.txt"

' Test seznamu, pokud neni, skonci
If Not fso.FileExists(srce) Or Not fso.FileExists(srccz) Then
WScript.Echo "Soubor (soubory) chybí."
Set fso = Nothing
WScript.Quit
End If 

znak = Chr (32)

' naplnění pole CZ
Set txtStreamcz = fso.OpenTextFile(srccz)
    i = 0
	Do While Not (txtStreamcz.AtEndOfStream)	   
		linecz(i) = txtStreamcz.ReadLine
		'WScript.Echo linecz(i)		
		i = i + 1
	Loop
Set txtStreamcz = Nothing	

cilFile = path & "sloucit.txt"
Set txtStreame = fso.OpenTextFile(srce)
Set txtStream2 = fso.OpenTextFile(cilFile, 8, True)
' hledani prvniho anglickeho slova
Do While Not (txtStreame.AtEndOfStream)
   Text = txtStreame.ReadLine
   'WScript.Echo Text
   i = 1
   Do While Not znak = Mid (Text, i, 1)
      i = i + 1                         
   Loop
   slovoe = Mid (Text, 1, i - 1)
   'WScript.Echo slovoe
   Najdi(slovoe)
Loop   
Set txtStream2 = Nothing

'doplnění z czeska 
' nactení pole slouceneho 
Set txtStreamsl = fso.OpenTextFile(cilFile)
    i = 0
	Do While Not (txtStreamsl.AtEndOfStream)	   
		slouceny(i) = txtStreamsl.ReadLine
		'WScript.Echo slouceny(i)		
		i = i + 1
	Loop
Set txtStreamsl = Nothing
' hledani a doplneni chybejicich z cze
Set txtStream2 = fso.OpenTextFile(cilFile, 8, True)   
i = 0
For Each linka In linecz
signal = 0
  For Each radek In slouceny
      If  radek = linka Then signal = 1   
  Next
  If signal = 0 Then txtStream2.WriteLine linecz(i)
  i = i + 1
Next 

Set txtStream2 = Nothing
Set txtStreame = Nothing
Set fso = Nothing
WScript.Echo "Skript doběhl"

'________________________________________
'Funkce hledání
'________________________________________

Function Najdi(txt)
For Each radek In linecz	   			
		If InStr (radek, txt) Then txtStream2.WriteLine radek
Next	
End Function
A teď něco k použití:
- soubory jsou eng.txt a cze.txt a musí být ve stejném adresáři jako skript. Lhostejno kde, skript si cestu zjistí.
- skript kontroluje, zda soubory existují, pokud ne, nahlásí, že chybí.
- výsledný soubor je sloucit.txt, bude ve stejném adresáři. Pokud už tam takový je, skript ho nemaže, ale dopisuje na jeho konec.
- ukončení práce ohlásí "skript doběhl"

A teď:
- jména souborů lze měnit, v proměnných srce a srccz (řádek 25,26)
- jméno výsledného souboru lze měnit - proměnná cilFile (ř.48)
- oddělovač lze měnit - proměnná znak (ř.36). Lze ho zadat rovnou v uvozovkách např.: znak = " " (mezera), nebo jak mám já v ascii kódu Chr(32) je kód pro mezeru (https://jbwyatt.com/ascii.html), to kdybys chtěl použít speciální znaky, jako tab, nebo enter.
- Skript pro prohledávání používá dynamická pole. Pro český soubor je to linecz() a pro výsledek je to slouceny(). Protože jsou dynamická je třeba je dimenzovat, takže v ReDim (ř.15,16) musí být minimálně stejný počet řádků co je v českém souboru a předpokládaný počet řádků pro výsledný. Nastaveno je 100/150, pokud budeš mít soubory s 1000 řádků, je třeba to změnit. Není třeba tam rvát miliony, zbytečně by to zabíralo paměť. Měl jsi dodat vzorové soubory, líp by to šlo odladit.
Zamčeno
  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Soubory ve složkách na externím HDD se nezobrazují
    od Ghoust23 » » v Problémy s hardwarem
    7 Odpovědi
    4456 Zobrazení
    Poslední příspěvek od petr22
  • Flash disk - soubory nelze přehrát
    od Kincl6 » » v Vše ostatní (hw)
    3 Odpovědi
    6095 Zobrazení
    Poslední příspěvek od buchtik
  • Ve složce stažené soubory zmizely fotky a videa- jak je zachránit?
    od Ondras66 » » v Windows 11, 10, 8...
    3 Odpovědi
    6213 Zobrazení
    Poslední příspěvek od petr22

Zpět na „Vše ostatní (sw)“