Stránka 1 z 1

Program na smázání 3+řádků za 1 nový řádek?

Napsal: 17 led 2011 17:27
od CZechBoY
Zdravim,
existuje program který umí otevřít soubor(.log obsažen obyč text s UTF-8 kódováním) a přepsat v něm 3 a více nových řádků za 1? "\n\n\n"=>"\n"
Problém je v tom, že ten soubor má 3MB a některé programy ho neudokážou ani otevřít natož přepsat v něm obsah.
Pak je tu ještě oříšek, soubor který má 600MB

Neví někdo který program by se o to alespoň pokusil?

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 17 led 2011 17:30
od skunkicz
na otevření určitě gVim

http://www.vim.org/download.php

a co se týče toho programu......ten by se dal v c++ celkem pěkně napsat, ale nemám na to teď čásek...

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 17 led 2011 17:40
od CZechBoY
v C# mi to psal out of memory, zkus to v tom C++ :-)
vim nepotřebuju, mám Win7 a tam je notepad, nechce se mi tahat linuxovej program :D nebo by zvládl nahradit nový řádky?

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 17 led 2011 19:34
od skunkicz
aha on to je jeden problém :D

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 17 led 2011 20:07
od Jan Pašek
Já sem tem skoro ..-ti letej strejda zeptám se a co sprostá dávka tudy by to nešlo?
začneš příkazem FOR /D dáš přečíst řádek a nasměruješ jej do samostatného souboru nad tímto souborem provedeš potřebné operace a výstup nasměruješ do konečného souboru. nakonec původní soubor smažeš.
Tohle je pouze nástin pokud je to pro tebe zajímavé pokusím se to rozpitvat detalněji jak moc to spěchá?

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 17 led 2011 20:17
od X
V programovacím jazyku (i prachobyčejný BASIC to dokáže) otevřít kanál a načítat jen po částech, nemusí se ládovat 600 MB, ale pozor co se provede, můžeš pomrvit soubor.

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 18 led 2011 04:12
od faraon
Teda, co je to ten C# za jazyk že mu nestačí paměť? V obyčejném C jsem potřeboval 12 bajtů! Nojo, Microsoft se holt pozná :lol:

V Linuxu (a všech unixových systémech) by se to dalo vyřešit jedním řádkem v konzoli, krátký prográmek v BASICu by na to stačil také, ale co si vzpomínám, tak třeba ty microsoftí zvládnou načíst maximální délku řádku 255 B, a to by nemuselo v některých případech stačit. Takže bych to viděl asi takhle:

Kód: Vybrat vše

#include <stdio.h>

#define MAXIMUM 2
#define NAHRADA 1

int main(void)
{
    int c,n=0,r=0;

    while((c=getchar())!=EOF)
    {
        if('\n'==c)
        {
            ++n;
            if(n>MAXIMUM)
                n=NAHRADA;
        }
        else
        {
            if('\r'==c)
                r=1;
            else
            {
                while(n)
                {
                    if(r)
                        putchar('\r');
                    putchar('\n');
                    --n;
                }
                r=0;
                putchar(c);
            }
        }
    }
    while(n)
    {
        if(r)
            putchar('\r');
        putchar('\n');
        --n;
    }

    return 0;
}


Nezabýval jsem se nějakým otevíráním souborů, takže to musíš spustit z příkazového řádku a prohnat tím proud bytů:
radky.exe < soubor1.txt > soubor2.txt
Tím uděláš upravenou kopii, a když nebude něco fungovat tak si aspoň nepoškodíš ten původní soubor. Hlavně se nepokoušej zapisovat do toho samého ze kterého čteš, to fakt nefunguje.

Nahrazují se 3 a více konců řádků, takže tam kde je jen jeden řádek prázdný, ten zůstane, pokud bys chtěl změnit počet, stačí upravit konstantu MAXIMUM na požadovanou hodnotu, kolik konců řádků smí jít bezprostředně za sebou. Stejně tak si můžeš konstantou NAHRADA určit kolika řádky se má nahrazovat.

Ten program je trochu složitější, ale rozlišuje unixové konce řádků \n a windowsové \r\n, protože jinak by znak \r považoval za běžné písmeno a neodstranil by nic. Navíc, pokud by se v souboru vyskytovaly oba druhy (to se mi stává u starších textů z Windowsu, které dál doplňuji v Linuxu :wink:), tak je nechá tak jak jsou namíchané, nemění je.

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 18 led 2011 19:56
od X
V BASICu jde načítat kanál postupně (opakováním), takže žádné omezení v tomto není ...

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 19 led 2011 16:12
od CZechBoY
Zkusím ten program v c# ale už jen informativně ten 600MB soubor jsem smazal abych se tím už nezabýval :D stejně to jsou jen logy, které se hodí tak max týden od vytvoření
ale i tak díky

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 20 led 2011 03:58
od faraon
X píše:V BASICu jde načítat kanál postupně (opakováním), takže žádné omezení v tomto není ...


To je samozřejmě pravda:

Kód: Vybrat vše

10 OPEN "soubor1" FOR RANDOM AS #1
20 OPEN "soubor2" FOR RANDOM AS #2
30   a$=" ":j=1
40   FOR i=1 TO LOF(1)
50     GET #1,a$
60     ...


Má to jednu podstatnou chybu, to volání systému je strašně pomalá funkce, takže by těch 600 mega přežvykoval půl dne. Kdysi jsem se s tím dost natrápil, a výsledek byl ten že jsem tam dal a$=SPACE$(1024) a pak to sám rozkopíroval přes FOR do pole kde jsem to zpracovával, vyšlo to i ve šnečím interpretu několikanásobně rychlejší! Prostě jsem si udělal vlastní cache. Větší už neměla znatelný vliv, i když sektory na disku jsem měl 32 KB.
Z tohohle důvodu jsem automaticky uvažoval o LINE INPUT a$, zvlášť že se jedná o řádkový soubor, ale protože M$ se roky nedokázal přenést přes svůj osmibitový stín, tak dvacet let ve všech verzích BASICu pořád používal pro načítání do řetězce rutinu, kterou Gates napsal v pětasedmdesátém roce pro Altair, a délku ukládal do jednoho bajtu. Ne že bych očekával že v logu se objeví řádek delší než těch 255 B, ale sám víš jak to u počítačů chodí - jediná věc na kterou se můžeš spolehnout je to, že se nemůžeš na nic spolehnout ;-)

Takže nakonec jsem zvolil Céčko, kvůli rychlosti a také kvůli tomu, že takový program bude potřebovat minimum paměti, navíc se dá bez problémů přeložit v jakémkoliv systému, na Windowsu třeba pomocí free DevC++. Jen mě tak napadá, když by to spustil příkazem type soubor1.txt | radky.exe, dokáže to už Windows spustit paralelně jako unixové systémy, nebo si tu rouru pořád ukládá na disk do dočasného souboru, který pak pustí do toho druhého programu, jak to fungovalo od pětaosmdesátého roku v DOSu? :o

P.S. Bavíme se doufám o BASICu, a ne o tom Visualpaskvilu, který s ním kromě názvu nemá nic společného? Ten jsem si vyzkoušel a s nedobrým pocitem okolo žaludku jsem se radši věnoval Pascalu...

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 21 led 2011 01:15
od X
Tak bohužel na PC neznám žádný BASIC, který by byl dobrý. Proti Sam Basicu a Master Basicu na počítači Sam Coupé (následník ZX Spectra) nesahá ani po kotníky. V SB + MB šlo psát strojový kód přímo v BASICu, také ho z něho pouštět a ten se vykonával přímo z umístění BASICu.

Re: Program na smázání 3+řádků za 1 nový řádek?

Napsal: 22 led 2011 07:19
od faraon
Sam znám jen z doslechu, ale ty popisy vypadaly dost úchvatně. Já jsem začínal na Didaktiku Gama, dlouho jsem neměl ani pořádný kazeťák, takže jsem si svoje výtvory nahrával na kotoučák :) Dodnes si myslím že můj textový editor napsaný v BASICu byl dost dobře vymyšlený program, čeština s vlastním fontem (za REM v řádku 0, zapínal se přes POKE) namapovaným přes SymbolShift na příslušná písmena, pokud by se program zastavil nějakou chybou, dal se znovu spustit jedním příkazem RETURN bez poškození dat v paměti, a spusta dalších fíčur... Na tom jsem se vyřádil :-D
Dneska používám Chipmunk Basic, sice má pár vad, ale oplácí to spoustou krásných funkcí, které mi ty časy připomínají, umí třeba GOTO x*1000, to mi pak v QBasicu krutě chybělo, a nebo automaticky převádí na číslo výraz vložený na vstup do číselné proměnné i s názvy proměnných! Jinak je to taková směska všech možných basiců, takže třeba smazat obrazovku tam jde nejenom CLS ale i příkazem HOME, jako na Apple II, a podobně. Umí dokonce i objekty, ale to jsem fakt ještě nepoužil.