Slozitejsi nahrazovani retezcu
Pavel Lisy
pali na tmapy.cz
Pátek Leden 25 12:40:43 CET 2002
Dobry den
mořím se již několik hodin se syntaxí (vim funkce nebo perl), ale nemohu
přijít na to jak to vyřešit.
Potřebuji v textovém souboru změnit některé řetězce (datum ve formátu
yyyy-mm-dd). Při konverzi dat bohužel došlo k tomu, že některé datumy
mají prohozený den a měsíc. Jsem schopen dát dohromady algoritmus, ale
nevím, jak to přepsat do perlu, nebo do vim? Začal jsem ve vim:
Toto je kód z vimu, který funguje
--------------
function! Correctdate(rok, mes, den)
if rok = 2002
if mes = 1
return a:rok . "-" . a:mes . "-" . a:den
else den <= 12
return a:rok . "-" . a:den . "-" . a:mes
endif
else den <= 12
return "a:rok . "-" . a:den . "-" . a:mes"
endif
endfunction
while search("[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]", flags) > 0
let line = getline(".")
" -------------
" TOTO NEZABÍRÁ, nevím jak předat funkci Correctdate parametry
let repl = substitute(line, '\(\d\{4}\)-\(\d\{2}\)-\(\d\{2}\)', \
Correctdate(submatch(1),submatch(2),submatch(3)) , "g")
" -------------
call setline(".", repl)
endwhile
------
Potom jsem se to zkoušel přepsat do perlu, ale nevím, jak docílit toho,
že se mi nahrazující řetězec napřed zpracuje mojí funkcí:
-------
sub correctdate () {
local $rok=$1;
local $mes=$2;
local $den=$3;
print "$den:$mes:$rok"
}
open(INFILE,"data.sql");
open(OUTFILE,">data.out");
while ( defined($line=<INFILE>) ) {
$line =~ s/(\d{4})-(\d{2})-(\d{2})/&correctdate($1:$2:$3)/;
print OUTFILE $line;
}
close(OUTFILE);
close(INFILE);
---------
Uvítám každý pokus :-)
Pavel
--
Pavel Lisy <pali na tmapy.cz>
T-MAPY spol. s r.o., http://www.tmapy.cz
Nezvalova 850, Hradec Kralove, 50003
tel: +420-49-5513335 fax: +420-49-5513371
O mapach vime vse: http://www.tmapserver.cz
Další informace o konferenci Linux