[python] najdi, nahrad, uloz v ascii subore

Stefan Oravec stefan.oravec na realtime.sk
Pondělí Srpen 28 10:23:07 CEST 2006


Ahoj,

najprv nejaky flame :D

<flame>
ako to tu tak sledujem, tak by sa viacerym ludom zislo najprv  
nastudovat nieco o  algoritmoch a datovych strukturach. zakladny  
programatorsky skill nie je zistit ako to napises napr. v pythone  
alebo c++, lebo to je len hlupa syntax, ale ako to napises vo  
vseobecnosti, tak aby bol program spravny (spraval sa podla  
specifikacie) a optimalny (vyuzival optimalne zdroje cpu, ram, I/O).

to co chces spravit by som prirovnal k ucitelovi ktory ti da napisat  
10 stran textu a potom ti povie aby si na koniec druhej strany vlozil  
2 riadky textu a skodoradostne ti poda zmizik. to je presne to co  
chces ty od toho stroja.
</flame>

najoptimalnejsie riesenie pre relativne maly pocet zmien:
1. najdes blok (jeho poziciu v subore)
2. nacitas do pamete
3. upravis blok v pameti
4. ak sa blok zvecsil
4.1. prepises blok nejakym whitespejsom (seek+write neviem ako je to v  
pythone)
4.2. upraveny pridas na koniec suboru
5. ak sa blok nezvecsil
5.1. zarovnas whitespejsom na velkost povodneho bloku
5.2. prepises blok

nevyhoda: fragmentacia suboru - subor bude rast pri niektorom type modifikacii

najoptimalnejsie riesenie pre zmenu relativne velkej casti suboru:
sekvencne prechadzas subor, citas velke bloky suboru, v pameti  
upravujes a prepisujes v subore

nevyhoda: ziadna :D

jediny problem je zistit co je relativne vela a relativne malo.

S.

Quoting peter <borique at gmail.com>:

> Zdravim,
>
> potreboval by som poradit.
>
> Priklad (jeden blok v subore):
> $------------------------
> NAME='ALFA'
> CODE='x'
> $------------------------
>
> Takychto blokov je v subore vela s roznymi menami a kodmi. Potrebujem
> naprogramovat skript ktory prehlada cely subor a najde vyrazy s menami
> ALFA a podla toho co za kazdou ALFOU bude nasledovat (napr. x,y,z)
> zmeni meno ALFA na BETAx,BETAy, BETAz a zemeneny subor ulozi.
>
> Dostal som sa k tomu ze najdem vsetky vyrazy ktore potrebujem, podla
> kodu zmenim meno na BETAx,y alebo z ale uz neviem ako zapisat nove
> nazvy na rovnake miesto ako bola dana ALFA. Vzdy mi to zapise na koniec
> suboru. Tu je moj kod.
> Dakujem vopred za akukolvek pomoc.
>
> Moj kod:
>
>  import shutil
>
> NamFile="test2.nam"
> BackupNamFile = 1
> if BackupNamFile == 1:
>      shutil.copyfile(NamFile,NamFile.replace(".nam",".nam.bak"))
> LineNum=1
> LineNumQuantity=0
> ArrayCount=0
> LineNumArray=[]
> ReqArray=[]
> ReqName=""
> NamFileOpen=file(NamFile,"r+")
> for line in NamFileOpen:
>      LineTextFound1 = line.find("bk")
>      LineTextFound2 = line.find("_results")
>      if LineTextFound1 != -1 and LineTextFound2 != -1:
>           ReqName=line.split("'")[1]
>           print "Line: \t\t\t"+ str(LineNum)
>           print "Request Name: \t\t"+ ReqName
>           LineNumQuantity = LineNum + 2
>           ReqArray=[LineNum-2,ReqName]
>      if LineNum == LineNumQuantity:
>           QuantityName=line.split("'")[1]
>           print "Quantity Type: \t\t"+QuantityName
>           if QuantityName == "dx":
>                Suffix = "_disp"
>           elif QuantityName == "vx":
>               Suffix = "_velo"
>           elif QuantityName == "fx":
>                Suffix = "_force"
>           else:
>                Suffix = "_results"
>           print "Suffix: \t\t"+Suffix
>           NewReqName=ReqName.replace("_results",Suffix,1)
>           ReqArray.append(NewReqName)
>           LineNumArray.insert(ArrayCount,ReqArray)
>           ArrayCount+=1
>           print "New Request Name: \t"+NewReqName
>           print "-----------------------"
>      LineNum = LineNum+1
> print LineNumArray
> print len(LineNumArray)
> NamFileOpen.close()
>
> NamFileOpen2=file(NamFile,"r+")
> LineNum=1
> for i in LineNumArray:
>      print i
>      for line in NamFileOpen2:
>           print line
>           print LineNum
>           print i[1]
>           if i[0]== LineNum:
>                print i[0]
>                print LineNum
>                print line
>                Temp=line.replace(line.split("'")[1],i[2],1)
>                print Temp
>                NamFileOpen2.write(Temp)
>           LineNum=LineNum+1
> NamFileOpen2.close()
>
> _______________________________________________
> Python mailing list
> Python at py.cz
> http://www.py.cz/mailman/listinfo/python
>
>



--
application/x-person


Další informace o konferenci Python