Autor Téma: Nedaří se mi načíst data  (Přečteno 1339 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 299
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #15 kdy: 17-09-2018, 19:41:34 »
Ještě jsem to nevzdal. A už jsem to rozjel.

Kód: Delphi [Vybrat]
  1. FileHandle := FileCreate(s);
  2. if (FileHandle < 1) then
  3.                              showmessage('Ah' + inttostr(FileHandle) );
  4. FileWrite(FileHandle, buffer[1] , length(buffer) );
  5. fileclose(FileHandle);
  6.  

O té funkci FileCreate jsem se dozvěděl až teď.

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Nedaří se mi načíst data
« Odpověď #16 kdy: 18-09-2018, 06:16:13 »
Myslím, že tohle dobře demonstruje, co děláš špatně:

1) Předčasná optimalizace. Na prvním místě by ses měl snažit napsat program tak, aby fungoval a aby se dal udržovat, a teprve když to máš splněno, má smysl řešit optimalizaci. A to na základě konkrétních dat, tedy měření, která část programu je pomalá, ne podle odhadu od stolu.

2) Nesrozumitelné zápisy. Až ten program dokončíš, půl roku bude chodit k tvé plné spokojenosti a potom na tebe vyhodí hlášku "Ah5423852", budeš schopen říct, co tím myslí?

3) Používání nevhodných konstrukcí. FileCreate a spol. rozhodně mají svůj smysl, ale jsou to nízkoúrovňové funkce, fakticky obal sjednodcující volání v různých operačních systémech. Jako takové mají velmi omezenou použitelnost pro programátora - slouží hlavně tvůrcům základních knihoven. Programátor by měl používat buď vysokoúrovňové abstrakce (TFileStream), nebo přímo volání OS (CreateFile), pokud pro ně má rozumné uplatnění (např. nastavení režimů, které wrapper neumí, třeba vypnutí bufferování pod Windows). Tvoje chyba není v tom, že nevíš, že to jsou nevhodné konstrukce, to je u začátečníka přirozené, ale v tom, že nejsi ochoten přijmout doporučení zkušenějších.

4) Neřešení mezních stavů. Jaké hodnoty ti může vrátit funkce FileCreate? Za jakých okolností k tomu dojde? Pokud už ta situace nastane, jak přesně se tvůj program zachová? V kódech na předchozí stránce například: Co program udělá, pokued požadovaný adresář neexistuje? Atd.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 299
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #17 kdy: 18-09-2018, 12:47:00 »
Myslím, že tohle dobře demonstruje, co děláš špatně:

Těmihle věcmi se nezabývám, protože jde o jednorázovou záležitost. Použiju to jednou a nikdy více. Podobně jako zrovna teď potřebuju ve všech souborech nahradit <START> za new_line + carriage_return (vložení nového řádku místo <START>). Použiju to jednou a nikdy více. Normálně na záměnu řetězců používám PSPad, ale tuhle operaci neumí (aplikovat na všechny hledané soubory). Tak si na to musím napsat program.

PS: Souborů je asi 65000 a jsou uložené na RAM disku, takže v PSPAdu to trvá několik minut než se vše projde a zedituje.
« Poslední změna: 18-09-2018, 12:50:07 od vangog »

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 924
  • Karma: 26
    • Verze Delphi: XE8, Seattle
Re:Nedaří se mi načíst data
« Odpověď #18 kdy: 18-09-2018, 13:01:12 »
Důležité je mít odladěn algoritmus pro jeden soubor, pak se dá snadno zřetězit i pro tisíce. Tak bych to asi dělal já.
A jestli je to jednorázová záležitost, tak potom už na nějaké té minutě navíc snad ani nezáleží.

Delfin instaluje

  • Host
Re:Nedaří se mi načíst data
« Odpověď #19 kdy: 18-09-2018, 14:12:12 »
Podobně jako zrovna teď potřebuju ve všech souborech nahradit <START> za new_line + carriage_return (vložení nového řádku místo <START>). Použiju to jednou a nikdy více. Normálně na záměnu řetězců používám PSPad, ale tuhle operaci neumí (aplikovat na všechny hledané soubory). Tak si na to musím napsat program.

Napr. https://github.com/zzzprojects/findandreplace?

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Nedaří se mi načíst data
« Odpověď #20 kdy: 18-09-2018, 14:36:31 »
Myslím, že tohle dobře demonstruje, co děláš špatně:

Těmihle věcmi se nezabývám, protože jde o jednorázovou záležitost.
Pak si na to vzpomeň. Ale budiž, je to tvůj boj.

Citace
Podobně jako zrovna teď potřebuju ve všech souborech nahradit <START> za new_line + carriage_return (vložení nového řádku místo <START>). Použiju to jednou a nikdy více. Normálně na záměnu řetězců používám PSPad, ale tuhle operaci neumí (aplikovat na všechny hledané soubory). Tak si na to musím napsat program.
Nebo najít jiný program, který to umí. Kdybys například uměl regulární výrazy, tak to zvládneš udělat mnoha různými programy a nebudeš kvůli tomu muset nic programovat.
Taky by sis mohl nastudovat regulární výrazy a pak to udělat jedním z mnoha programů, které to dokážou.

Delfin instaluje

  • Host
Re:Nedaří se mi načíst data
« Odpověď #21 kdy: 18-09-2018, 14:46:27 »
Nebo najít jiný program, který to umí. Kdybys například uměl regulární výrazy, tak to zvládneš udělat mnoha různými programy a nebudeš kvůli tomu muset nic programovat.
Taky by sis mohl nastudovat regulární výrazy a pak to udělat jedním z mnoha programů, které to dokážou.

Tak urcite. Nicmene otazkou je, zda ma smysl se kvuli jednorazove uloze ucit regularni vyrazy. Osobne pouzivam grep, ale ten fnr vypada jako pomerne snadna "klikacka" a pro dany ucel by snad mohl stacit (bohuzel nevim zda podporuje zadani CRLF).

S tim ze OP obcas stavi raketoplan uz jsem se smiril :)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 299
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #22 kdy: 18-09-2018, 14:50:09 »
[quote author=Delfin instaluje link=topic=16324.msg101538#msg101538
Tak urcite. Nicmene otazkou je, zda ma smysl se kvuli jednorazove uloze ucit regularni vyrazy. Osobne pouzivam grep, ale ten fnr vypada jako pomerne snadna "klikacka" a pro dany ucel by snad mohl stacit (bohuzel nevim zda podporuje zadani CRLF).

S tim ze OP obcas stavi raketoplan uz jsem se smiril :)
[/quote]

Regulární výrazy umím. Já používám toto
https://www.yunqa.de/delphi/products/regex/index
ale na replace jsem to ještě nepoužíval. Tak teď musím zahledat v nápovědě

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Nedaří se mi načíst data
« Odpověď #23 kdy: 18-09-2018, 19:50:04 »
Tak urcite. Nicmene otazkou je, zda ma smysl se kvuli jednorazove uloze ucit regularni vyrazy.
Ano, má. Regexpy jsou univerzálně užitečné, určitě to nebude "jednorázová úloha".

Delfin instaluje

  • Host
Re:Nedaří se mi načíst data
« Odpověď #24 kdy: 18-09-2018, 20:59:03 »
Tak urcite. Nicmene otazkou je, zda ma smysl se kvuli jednorazove uloze ucit regularni vyrazy.
Ano, má. Regexpy jsou univerzálně užitečné, určitě to nebude "jednorázová úloha".

Hmno. Kdybych si potreboval hanhle osetrit trebas poranenou ruku, nebudu se ucit medicinu. Pokud jde o jednorazovou akci, netvoril bych kvuli tomu aplikaci ani se neucil regex. Pouzil bych hotova reseni. Ale co bych tady rikal...

Delfin instaluje

  • Host
Re:Nedaří se mi načíst data
« Odpověď #25 kdy: 18-09-2018, 21:47:15 »
Tak urcite. Nicmene otazkou je, zda ma smysl se kvuli jednorazove uloze ucit regularni vyrazy.
Ano, má. Regexpy jsou univerzálně užitečné, určitě to nebude "jednorázová úloha".
[/quote]

Mnohem vetsi smysl v dnesni dobe ma se naucit nejaky moderni jazyk, jako napr. C#. Regularni vyrazy, OK, ale netusim proc bych mel radit nekomu kdo chce udelat jednorazovou akci. Dobra, mnohokrat, stejnou (tezko z dotazu rict, mozna vis vic), ale proc se kvuli tomu kousat spoustou materialu kdyz by se dal napsat i regex vyraz pro find a replace a ten pouzit nekoikrat v navrhovanych aplikacich?

A ted do me :)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 299
  • Karma: 0
    • Verze Delphi: 7
Re:Nedaří se mi načíst data
« Odpověď #26 kdy: 18-09-2018, 22:27:28 »
Delfíne, já právě regulární výrazy používám už řadu let, občas se hodí i složitější věci.

Dejmetomu, že v jednotlivých jazycích jsou menší odlišnosti v aplikaci, ale to je popsáno v nápovědě. V tomto případě se mi vyplatí naučit se pracovat s knihovnou DIRegEx, protože ji plánuji používat i v budoucnu.

Tedy kód který si osvojím dnes, zase využiji příště. Regulární výrazy nejsou jednorázovou záležitostí, to stačí upravit v příštím použití.

PS:
Mám k tomu sice manuál, ale nejsem moudrý z toho, jak vygenerovat chybovou hlášku pomocí procedury

DIRegEx.TDIRegExBase.Error

proc class procedure Error(
  const ResStringRec: PResStringRec;
  const Args: array of const);
 
Description:
Raises an EDIRegExError exception with a message string that is loaded from the application’s resources and then formatted.

Nějaká pomoc?

PS 2:
class DIRegEx.EDIRegExError
Syntax
Syntax: type EDIRegExError = class(Exception)
Hierarchy: EDIRegExError > Exception
Description:
The exception type raised by TDIRegEx and TDIRegEx16 in case of errors.

PS 3:
field DIRegEx.TDIRegExBase.FErrorMessage
Syntax
field FErrorMessage: PAnsiChar;
Description:
Holds a pointer to the PCRE error string.
 
« Poslední změna: 18-09-2018, 22:39:07 od vangog »

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Nedaří se mi načíst data
« Odpověď #27 kdy: 18-09-2018, 22:34:05 »
ale proc se kvuli tomu kousat spoustou materialu kdyz by se dal napsat i regex vyraz pro find a replace a ten pouzit nekoikrat v navrhovanych aplikacich?
Protože regexpy využije skoro pořád, a proto se hodí je umět. Kromě toho "dal napsat regex výraz" je sice hezká teorie, ale v praxi je potřeba, aby to bylo napsané pro konkrétní nástroj, ve kterém se to bude dělat. Aneb, pomůže vangogovi nějak zásadně, když mu napíšu regulární výraz pro nástroj, který nemá, nezná a nejspíš ani znát nechce?

Ale pro mě za mě...

1) FAR Manager + plugin RESearch
2) Najet do adresare, kde chci provest zmeny
3) F11
4) Regular Expression Search
5) Replace
6) File mask = *.*
7) Search for = <start>
8) Replace with = \n
9) Regular expression
10) Search: From the current folder
11) Všechno ostatní odškrtnout
12) OK
13) Hotovo. Celkový čas kolik, minuta?

Offline pepak

  • Guru
  • *****
  • Příspěvků: 1401
  • Karma: 34
    • Pepak.net
Re:Nedaří se mi načíst data
« Odpověď #28 kdy: 18-09-2018, 22:37:00 »
Dejmetomu, že v jednotlivých jazycích jsou menší odlišnosti v aplikaci, ale to je popsáno v nápovědě. V tomto případě se mi vyplatí naučit se pracovat s knihovnou DIRegEx, protože ji plánuji používat i v budoucnu.
Osobně preferuju TPerlRegEx, která je zdarma (a tuším od XE2 přímou součástí Delphi), ale podle popisu se to zdá být velice podobné.

Citace
Tedy kód který si osvojím dnes, zase využiji příště. Regulární výrazy nejsou jednorázovou záležitostí, to stačí upravit v příštím použití.
Přesně tak. Upřímně řečeno mě překvapuje, že to Delfín neví.

Citace
PS 2:
class DIRegEx.EDIRegExError
Syntax
Syntax: type EDIRegExError = class(Exception)
Hierarchy: EDIRegExError > Exception
Description:
The exception type raised by TDIRegEx and TDIRegEx16 in case of errors.
Raise DIRegEx.EDIRegExError.Create('Něco se mi rozbilo');

Delfin instaluje

  • Host
Re:Nedaří se mi načíst data
« Odpověď #29 kdy: 18-09-2018, 23:01:25 »
Podobně jako zrovna teď potřebuju ve všech souborech nahradit <START> za new_line + carriage_return (vložení nového řádku místo <START>). Použiju to jednou a nikdy více.

Pro tohle, je podle Tebe pepaku treba psat aplikaci? Nebo se ucit regex? OMG ::) ;D