Jak sloučit soubory? Vyřešeno

...

Moderátor: Mods_senior

_hm
nováček
Příspěvky: 26
Registrován: červenec 20
Pohlaví: Muž
Stav:
Offline

Re: Jak sloučit soubory?

Příspěvekod _hm » 02 zář 2020 23:16

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);

Reklama
flowem
Level 5.5
Level 5.5
Příspěvky: 2830
Registrován: březen 13
Pohlaví: Muž
Stav:
Offline

Re: Jak sloučit soubory?

Příspěvekod flowem » 02 zář 2020 23:45

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: 7359
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Jak sloučit soubory?

Příspěvekod faraon » 03 zář 2020 21:16

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 38 x
"Král Lávra má dlouhé oslí uši, král je ušatec!

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

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23601
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Jak sloučit soubory?  Vyřešeno

Příspěvekod ITCrowd » 03 zář 2020 21:45

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.
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Jak kopírovat soubory z hostitele do VirtualBoxu? Příloha(y)
    od atari » 26 črc 2023 16:36 » v Windows 11, 10, 8...
    5
    1490
    od atari Zobrazit poslední příspěvek
    27 črc 2023 11:30
  • Jak zobrazit soubory z ostatních disků Příloha(y)
    od xDwery » 24 kvě 2023 14:57 » v Problémy s hardwarem
    2
    695
    od xDwery Zobrazit poslední příspěvek
    24 kvě 2023 20:09
  • Jak zobrazit soubory z ostatních disků.
    od xDwery » 24 kvě 2023 06:05 » v Problémy s hardwarem
    1
    581
    od ITCrowd Zobrazit poslední příspěvek
    24 kvě 2023 06:26
  • W11-Otvírají se všechny text soubory
    od supfor » 06 bře 2024 20:24 » v Windows 11, 10, 8...
    4
    806
    od supfor Zobrazit poslední příspěvek
    15 bře 2024 20:41
  • Soubory na ikoně excel hlavního panelu Příloha(y)
    od VOM » 03 led 2024 19:28 » v Kancelářské balíky
    3
    1042
    od VOM Zobrazit poslední příspěvek
    05 led 2024 10:46

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

Kdo je online

Uživatelé prohlížející si toto fórum: Majestic-12 [Bot] a 3 hosti