Hozzászólások
-
SzerzőBejegyzés
-
Jobb hijjan regexp-el oldottam meg….
Code:def cfgCompare(file1,file2):”’ Compares two cfg files
Thia function compares file2 to file1 (base file).
If there are no differences returns 0 else 1. In case of exceptions (file opening,
key violation) returns 1 as well.
”’
SECTION = re.compile(‘^s*[s*([^]]*)s*]s*$’)
PARAM = re.compile(‘^s*(w+)s*=s*(.*)s*$’)
PARAMCOMMENT = re.compile(‘^[^;](.*)={1}(.*);.*$’)
COMMENT = re.compile(‘^.*;.*$’)
d = {}
t = {}
diffsect = {}
try:
f = open(file1)
f2 = open(file2)
except:
return 1
def iniprocess(file,tar):
for line in file:
m = SECTION.match(line)
if m:
section, = m.groups()
tar[section.strip()] = {}
m = PARAMCOMMENT.match(line)
if m:
key, val = m.groups()
tar[section][key] = val
if COMMENT.match(line):
continue
m = PARAM.match(line)
if m:
key, val = m.groups()
tar[section][key.strip()] = val.strip()iniprocess(f,d)
iniprocess(f2,t)
try:
for k in d.keys():
diffsect[k] = {}
for i in d[k].keys():
diffsect[k][i] = {}
if d[k][i] t[k][i]:
diffsect[k][i] = d[k][i]
except KeyError:
return 1
if (diffsect.__len__()) == 0:
return 0
else:
return 1Ahogy latom, ami nehezze teszi a regexp szurest (nekem), az az, hogy ugy vannak tobb soros kommentek, hogy pl. a „; kommentek” utan soremeles van, a kovetkezo sor TAB-okat es jopar SPACE-t tartalmaz mielott jonne a „; tovabbi kommentek”. Mellesleg a modul beolvasaskor alapbol kiszuri a kulcs-ertek parokkal egy sorban levo kommenteket (pl. „; kommentek”) ami jo, de meghagyja a sortores utaniakat (pl. „; tovabbi kommentek” es „; kb ilyen formaban ahogy latod”). Nekem ezek se kellenek mint ahogy a sor eleji kikommentezett sorok sem (pl. „; MaxCacheMisses = 128”).
Na, ez jo hosszu lett:)Sziasztok! Ujabb kerdesem lenne, ezuttal a ConfigParser modullal es a forras cfg fajlbol olvasas szuresevel kapcsolatban.
Azt szeretnem elerni az emlitett modul felhasznalasaval, hogy a commentek egyaltalan ne legyenek beolvasva. Guglizas utan sem talaltam a modulnak olyan funkciojat ami ezt lehetove teszi, pedig kezenfekvonek tunik. Masik otletem, hogy beolvasaskor regexp-el szurom a beolvasott dolgokat es group-olassal kiszedem. Nem igazan sikerult eddig, mert nehe tobb soros illeszkedest kell nezni az meg nem az erossegem. Bemasolom a sima – mindent beolvaso – kodot megkoszonom ha kiegeszititek a fenti szurest megvalosito resszel. Tehat semmilyen kommentet ne olvasson be.Code:import ConfigParserconfig = ConfigParser.ConfigParser()
config.read(„sample.cfg”)
for section in config.sections():
print section
for option in config.options(section):
print ” „, option, „=”, config.get(section, option)sample.cfg
Code:[valamiblokk]
egyebdefinicio = 128 ; kommentek
; tovabbi kommentek
; kb ilyen formaban ahogy latodmegintvalami = 192000 ; The maximum number of pricers to allocate
masvalamifdsfdsdfs = 25000 ; how often (in terms of pricing calls)
; to log cache usage statistics;; other parameters
DefaultCacheSize = 1024
VolaBucketSize = 0.001 ;
; MaxCacheMisses = 128
; MaxShiftRatio = 0.3pontosan: Általános Linux problémák/Programozas/Python – szerintem nem off.
Az egy dolog, hogy a konkret pelda egy win-es ini fajlt parsol, de a feladat ugyanez linuxon is, nem? Ott is parsolsz config fajlokat (akar ini-t is)…Mindenesetre megoldottam kozben, aki kelloen Python-nak latja a kodot nezze meg 🙂
Code:import ConfigParserind = „”
dirdict = {„[AQTOR dll]”: „AQTOR”,
„[AQTOR]”: „AQTOR”,
„[MaketSpecificDLLsNotSelgRegistered]”: „AQTOR”,
„[MarketSpecificDLLs]”: „AQTOR”,
„[Install Files]”: „Install”,
„[System dll]”: „C:WINDOWS”,
„[AQTOR Files]”: „AQTOR”
}
pre = ‘, „‘
pos = ‘”‘try:
outf = open(‘iscab_result.ini’ , ‘w’)
except IOError:
print „Couldn’t open file ” + outf
sys.exit(1)config = ConfigParser.ConfigParser()
config.read(„iscab.ini”)for section in config.sections():
kkey = „[” + section + „]”
if kkey „[ISCAB Info]”:
outf.write(kkey + „n”)
for option in config.options(section):
try:
if kkey „[System dll]”:
outp = option + „=” + config.get(section, option) + ‘, „‘ + ind + „\” + dirdict[kkey] + ‘”‘ + „n”
else:
outp = option + „=” + config.get(section, option) + ‘, „‘ + dirdict[kkey] + ‘”‘ + „n”
outf.write(outp)
except:
passreszlet az ini-bol:
Code:[MaketSpecificDLLsNotSelgRegistered]
File1=”libeay32.dll”
File2=”ssleay32.dll”[MarketSpecificDLLs]
File1=”mtapi.dll”[Install Files]
File1=”ActivAMEX.reg”
File2=”ActivARCA.reg”
File3=”ActivBOX.reg”
File4=”ActivCBOE.reg”
File5=”activinfo.txt”
File6=”ActivISE.reg”
File7=”ActivPCX.reg”bocs, a kod:
Code:import sys
import re# ini-blok – hozzaadni valo directory path-ok
dirdict = {„[AQTOR dll]”: „AQTOR”,
„[AQTOR]”: „AQTOR”,
„[MaketSpecificDLLsNotSelgRegistered]”: „AQTOR”,
„[MarketSpecificDLLs]”: „AQTOR”,
„[Install Files]”: „Install”,
„[System dll]”: „C:WINDOWS”,
„[AQTOR Files]”: „AQTOR”
}
pre = ‘, „‘
pos = ‘”‘f = open(„iscab.ini”)
insect = 0
for line in f:
line = line.strip()
for k, v in dirdict.items():
if line == „”:
print line
break
elif re.match(‘\’ + k, line):
print line
insect = 1
break
elif not re.match(‘[‘, line) and insect == 1:
print line + pre + v + pos
break
elif re.match(‘[‘, line):
insect = 0
# break
else:
breakSzasztok! Gondolom alapfeladat, de mar kiguvad a szemem. Pls help.
Szoval: az alabbi script feladata az lenne, hogy vegigmegy egy ini file-on. Ha egy nevezetes dictionary-ban key-kent definialt blokkba er, akkor a blokkban szereplo sorok utan vesszovel hozzakonkatenalja a dictionary-ban az adott blokkhoz rendelt (kulcs erteke) hozzaadnivalot 🙂
Az alabbi script baja, hogy mindig minden blokkban szereplo ertekhez a „c:WINDOWS”erteket rendeli, ami nyilvan azert lehet mert kulcs alapjan abc sorrendben az az utolso kulcs-ertek. Koszi elore is.köszi, ez is műk 🙂
C-ben végülis így oldottam meg – a javaslat alapján cilusba tettem a memória allokációt (+ a vizsgélatot újabb függvénybe)
int memOccSucceed (char *par) {
if (par == NULL) {
exit(1);
}
else {
return 0;
}
}int fileReader () {
FILE *FILEIN;
char *tomb[20];
int i=0;FILEIN = fopen(„/home/cucc/szoveg.txt”, „r”);
char *sor;
size_t hossz=255;
sor = malloc(hossz);memOccSucceed(sor);
while(getline(&sor,&hossz,FILEIN) != -1) {
tomb=sor;
i++;
sor = malloc(hossz);
memOccSucceed(sor);
}
free(sor);
fileWriter (tomb, i);
return 0;
}Amúgy továbbra sem ír ki semmit. Fut, majd egy idő után kiírja az eclipse konzoljára:
terminate called after throwing an instance of ‘std::bad_alloc’
what(): std::bad_alloc -
SzerzőBejegyzés
legutóbbi hsz