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

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

Uziv00
Pohlaví: Nespecifikováno

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

Příspěvekod Uziv00 » 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.


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • eqkes = nejdou otevřít soubory (jpg, doc, xls...) Příloha(y)
    od pajauh » 11 srp 2024 10:58 » v Vše ostatní (bezp)
    8
    9212
    od pajauh Zobrazit poslední příspěvek
    24 zář 2024 18:07
  • Soubory ve složkách na externím HDD se nezobrazují
    od Ghoust23 » 12 led 2025 20:40 » v Problémy s hardwarem
    7
    3150
    od petr22 Zobrazit poslední příspěvek
    14 led 2025 12:27
  • Flash disk - soubory nelze přehrát
    od Kincl6 » 18 pro 2024 21:13 » v Vše ostatní (hw)
    3
    3687
    od buchtik Zobrazit poslední příspěvek
    19 pro 2024 12:16
  • Ve složce stažené soubory zmizely fotky a videa- jak je zachránit?
    od Ondras66 » 03 kvě 2025 19:28 » v Windows 11, 10, 8...
    3
    4280
    od petr22 Zobrazit poslední příspěvek
    05 kvě 2025 14:38

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

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 1 host