>       My first thought would be to do fewer substitutes, which could be done
>       if your hashes are nested, so you have a double-dereferencing.
>       Something like
>
>
>               :%s/TSWK1\|TSWK2\|TSWK3/\=s:hash[submatch(0)]/g
>
>
>       or, if you have a bunch of keys, you might be able to do something like
>
>
>               :let @/=join(keys(s:hash), '\|')
>               :%s//\=s:hash[submatch[0]]/g
>
>
>       (you might have to escape the keys if there are funky regexp
>       metacharacter values in the hash keys)

I think your first idea was the best even if I don't understand how it
works and so can help to my pb.


Sum up :

A - I read some data and building structure to stored them.
-------------------------------------------------------------------------------------

let myHash= {}
let g:cnt = 1
g/patternOfReadline/=call myStoredFunc(submatch(0),..........submatch
(dataN))

func! myStoredFunc()
  let myHash[g:cnt]= {'data1':a:data1,'data2':a:data2 etc....
'data5':a:data5}
  let g:cnt +=1
endfunc

take 10 seconds so it's nothing... well



B - Using the stored data to generate xml data
-------------------------------------------------------------------------------------

B1 - by for on key of my hash  => 35 seconds

let lineToChange = '<xmltag attr="DATA1_TO_CHANGE"
attr="DATA2_TO_CHANGE" attr="DATA1_TO_CHANGE" attr="DATA4_TO_CHANGE"/
>'
for key in keys(myHash)
     let newline = substitute(lineToChange, "DATA1_TO_CHANGE", myHash
[key].data1,"g")
     let newline .= substitute(lineToChange, "DATA2_TO_CHANGE", myHash
[key].data2,"")
     let newline .= substitute(lineToChange, "DATA4_TO_CHANGE", myHash
[key].data4,"")
     let newcontent .= newline
endfor

exec 'norm O' . newContent
====> 35 seconds



B2 - by map and join

Instead of hash of Dict I have 4 List (as many as fields of the old
Dict) and then :

let lineToChange = '<xmltag attr="DATA1_TO_CHANGE"
attr="DATA2_TO_CHANGE" attr="DATA1_TO_CHANGE" attr="DATA4_TO_CHANGE"/
>'
let List= map(copy(myList_data1), '"<xmltag attr=\"" . v:val . " attr=
\". myList_data2[v:key]. "\" attr=\"" . v:val     etc...............""
',)

let newContent = join(List,'')
exec 'norm O' . newContent

====> 50 seconds
If I do as many map as that I have concat to do ,      50 * N of
concat


Can you explain again you method please ?
:let @/=join(keys(s:hash), '\|')
>               :%s//\=s:hash[submatch[0]]/g

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

Reply via email to