On 24 déc, 15:14, Tim Chase <[email protected]> wrote:
> > Goal : multiply some parts of lines which contain factors
>
> > foo(2)bar(9)
>
> > Should become
>
> > foo1bar1
> > foo1bar2
> ...
> > foo1bar9
> > foo2bar1
> > foo2bar2
> ...
> > foo2bar9
>
> > I have done a func that receive (foo,2,bar,9) but it take 0.0008
> > second.
>
> Given that regardless of how the function is implemented, it will have
> polynomial time characteristics, 0.0008 seconds isn't bad at all.  Given
> that you haven't posted the body of your function, it's a little hard to
> sniff for hot-spots.  If it's something you only have to perform once,
> it may be best to just let it run (albeit slowly), rather than spend
> hours optimizing something for a one-time run.  However, if it's
> something repeatable, you might already be close to optimal performance.
>   Otherwise, I'd write a little python (or if you're a perl/awk/ruby
> programmer, use one of those) script to do the dirty work for you.
>
> > In fact I have more than 2000 lines with this format : foo(2)bar(9)
> > or other possible cases
>
> > foobar
> > foo(X)bar
> > foobar(Y)
> > foo(X)bar(Y)
>
> > foo(X)bar(Y)foo(Z)
> > foobar(Y)foo(Z)
> > foo(X)barfoo(Z)
>
> You haven't mentioned what to do with missing X or Y values, and haven't
> detailed Z...An empty value could be interpreted as 0 or 1, and Z could
> be an additional combinatoric factor.  And you don't give a decent way
> of recognizing the various parts...is "foobar" just one instance, or is
> that "foo" followed by an implicit count, followed by a "bar"?  And in
> the Z lines, does it repeat the same match as before?  Can there be more
> than 3 number instances?  Are "foo" and "bar" regular expressions or are
> they constant text?
>
> There are a lot of details you omit which makes it hard to provide a
> solution.  Again.  You've been asked multiple times in other threads to
> pose the problem in its entirety which includes expected inputs *and*
> the expected outputs.
>
> > Have you got another way to improve instead of doing
> > g/\([^(]\)\((\d\+)\)....../\=myFunc(submatch(1) etc...)/
>
> Well, again, you've not posted the actual code you're using since
> submatch(n) is only available within a :s command (which you likely
> intended) and not a :g command (which you typed), and your function
> syntax doesn't compile, so it's hard to even guess what your function does.
>
> Please answer all of the above questions regarding the problem
> space...only then can we begin to help you.  Though given that it sounds
> like you have a working-but-slow solution, just use that one.  Or maybe
> even post its code so we have something to work from to try and infer
> "correct" behavior.
>
> I was going to hammer out a quick python script to tackle the problem,
> but the problem is too ill-defined to get anywhere.
>
> -tim- Masquer le texte des messages précédents -
>
> - Afficher le texte des messages précédents -



If I don't post the code, that's there is a reason. Give me your email
and I will tell you.


""""""""""""""""""""""""""""""""""""""""""""""""""""
"
" Fonction Multiply
" ------------
" Description : cette fonction est appelee a chaque lecture d'une
ligne
" contenant (N) afin de dupliquer la ligne N fois + iteration
"
" Retour : elle retourne les données correctement structurees
" au format Xml (gestion balises ouvrante/fermantes et regroupement de
" plusieurs proprietes d'un meme device_type
"
""""""""""""""""""""""""""""""""""""""""""""""""""""
function! Multiply(chemin,nbChemin,nom,nbNom,lastPart)

        let cheminReconstitue = ''

        " balise Xml

        " attributs
        let categorie = 'categorie'
        let type = 'type'


        " cas ou seul le chemin ne contient pas de nombre
        if a:nbChemin == "" &&  a:nbNom != ""

                try
                        let nbRepetChemin = 1
                        let nbRepetNom = a:nbNom
                        let part1ARepeter = a:chemin . a:nom
                        let part2ARepeter = ""
                catch /.*/
                        return " [DBG] : " . getline(".") . ' => ' . "cas ou 
seul le chemin
ne contient pas de nombre"
                endtry

                " cas ou l'on ne passe jamais en raison de la regexp d'entree
        elseif a:nbChemin != "" &&  a:nbNom == ""

                try
                        let nbRepetChemin = a:nbChemin
                        let nbRepetNom = 1
                        let part1ARepeter = a:chemin
                        let part2ARepeter = a:nom
                catch /.*/
                        return " [DBG] : " . getline(".") . ' => ' . "cas ou 
seul le chemin
ne contient pas de nombre"
                endtry

                "return "DBG : " . getline(".") . ' => ' . 'Cas ou on ne doit 
jamais
passer'

                " cas ou ni le chemin ni le nom ne contiennent de nombre
        elseif a:nbChemin == "" &&  a:nbNom == ""

                "return "DBG : " . getline(".") . ' => ' . a:chemin . a:nom     
. ' cas
ou il ny a pas de numero'
                " gere internal ref categorie et type
                let chemin = a:chemin . a:nom
                return a:chemin . a:nom . '
'

                " cas ou le chemin et le nom contiennent un nombre
        else

                let nbRepetChemin = a:nbChemin
                let nbRepetNom = a:nbNom
                let part1ARepeter = a:chemin
                let part2ARepeter = a:nom
                " return "DBG : " . getline(".") . ' => ' . a:chemin . ' ' .
a:nbChemin . ' ' . a:nom . ' ' . a:nbNom
        endif



        " duplication des lignes
        let idxRepetChemin = 1
        let idxRepetNom = 1

        while idxRepetChemin <= nbRepetChemin
                while idxRepetNom <= nbRepetNom

                        if nbRepetChemin > 1 && nbRepetNom > 1
                                let cheminReconstitue .= part1ARepeter . 
idxRepetChemin .
part2ARepeter . '_' . idxRepetNom
                        elseif (nbRepetChemin > 1) && (nbRepetNom == 1)
                                let cheminReconstitue .= part1ARepeter . 
idxRepetChemin .
part2ARepeter
                        else
                                let cheminReconstitue .= part1ARepeter . 
part2ARepeter
                        endif

                        " gere internal ref categorie et type

                        let cheminReconstitue .=  a:lastPart . '
'
                        let idxRepetNom+=1

                endwhile
                "
                let cheminReconstitue .=  '
'
                let idxRepetNom=1
                let idxRepetChemin+=1
        endwhile


        return cheminReconstitue

endfunction

function! MultiplyFactorisedLines()

        let startConditionnalTime = reltime()
        %s/^\([^(]*\)\((\(\d\+\))\)\?\([^(]*\)\((\(\d\+\))\)\?\(.*$\)/
\=Multiply(submatch(1),submatch(3),submatch(4),submatch(6),submatch
(7))/g
        echo "Tps Multiply : pris par le conditionnel : " . reltimestr(reltime
(startConditionnalTime)) . " seconde(s)"

        g/^$/d

endfunc

-- 
You received this message from the "vim_use" maillist.
For more information, visit http://www.vim.org/maillist.php

Reply via email to