Here is my latest one :
(defun c:sjupdate ( / ASSPOS ASSPOSS ASSVAL K M N SJD SJDAT SJDL SJDL1 SJDL1ASSOC SJDL1POS SJDL1VAL SJDLASSLST SJDLN SJNEWD SJNEWDAT SJNEWDL SJOLDD SJOLDDAT SJOLDDL SJOLDDE X )
(setq sjdat (getfiled "Select sj.dat file" "" "dat" 16))
(setq sjd (open sjdat "r"))
(setq n 0)
(while (read-line sjd)
(setq n (1+ n))
)
(close sjd)
(setq sjd (open sjdat "r"))
(repeat n
(setq sjdl (read-line sjd))
(setq sjdln (strlen sjdl))
(while (< (if (/= (vl-string-position (ascii ";") sjdl) nil) (vl-string-position (ascii ";") sjdl) 0) sjdln)
(setq sjdl1 (substr sjdl 1 (vl-string-position (ascii ";") sjdl)))
(setq sjdl (vl-string-left-trim sjdl1 sjdl))
(if (= (vl-string-position (ascii ";") sjdl) 0) (setq sjdl (vl-string-left-trim "; " sjdl)) )
(setq sjdln (strlen sjdl))
(setq sjdl1pos (read sjdl1))
(setq sjdl1val (if sjdl1pos (read (vl-string-left-trim (itoa sjdl1pos) sjdl1))))
(setq sjdl1assoc (if sjdl1pos (cons sjdl1pos sjdl1val)))
(setq sjdlasslst (if sjdl1pos (cons sjdl1assoc sjdlasslst)))
)
)
(setq sjdlasslst (reverse sjdlasslst))
(setq sjdlasslst (vl-sort sjdlasslst '(lambda (a b) (< (car a) (car b))) ))
(close sjd)
(setq sjolddat (getfiled "Select sjold.dat file" "" "dat" 16))
(setq sjoldd (open sjolddat "r"))
(setq sjnewdat (getfiled "Select sjnew.dat file to save data into" "" "dat" 1))
(setq sjnewd (open sjnewdat "w"))
(setq n 0)
(while (read-line sjoldd)
(setq n (1+ n))
)
(close sjoldd)
(setq sjoldd (open sjolddat "r"))
(setq m -1)
(repeat n
(setq m (1+ m))
(setq sjolddl (read-line sjoldd))
(mapcar '(lambda (x) (if (and (< (* m 10) (car x)) (<= (car x) (* (+ m 1) 10))) (setq assposs (cons (car x) assposs)))) sjdlasslst)
(setq assposs (reverse assposs))
(setq k -1)
(repeat (length assposs)
(setq assval (cdr (assoc (setq asspos (nth (setq k (1+ k)) assposs)) sjdlasslst)))
(setq assval (strcat " " (rtos assval 2 2)))
(if (= k 0) (setq sjnewdl ""))
(setq sjnewdl (strcat sjnewdl (substr sjolddl (+ (strlen sjnewdl) 1) (- (+ (* (- (- asspos (* 10 m)) 1) 9) 1) (strlen sjnewdl)))))
(setq sjnewdl (strcat sjnewdl assval))
)
(if asspos (setq sjoldde (substr sjolddl (+ (* (- asspos (* 10 m)) 9) 1) (strlen sjolddl))))
(if (and sjnewdl sjoldde) (setq sjnewdl (strcat sjnewdl sjoldde)))
(if (/= (length assposs) 0) (write-line sjnewdl sjnewd) (write-line sjolddl sjnewd))
(setq asspos nil)
(setq sjoldde nil)
(setq sjnewdl nil)
(setq sjolddl nil)
(setq assposs nil)
)
(close sjnewd)
(close sjoldd)
(princ)
)
I used sj.dat :
15 -3.16; 4 -5.25; 8 -8.25; 12 -3.18; 151 -1.84
25 -4.32; 32 -9.13
43 -5.42; 38 10.18
And get this :
0.00 0.00 0.00 -5.25 0.00 0.00 0.00 -8.25 0.00 0.00
0.00 -3.18 0.00 0.00 -3.16 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 -4.32 0.00 0.00 0.00 0.00 0.00
0.00 -9.13 0.00 0.00 0.00 0.00 0.00 10.18 0.00 0.00
0.00 0.00 -5.42 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
-1.84
I've removed trailing zeros and made number positions like you showed in your first post. So 10.25 is possible, also 10.00, but not -10.25 and not -10.00; possible is -9.25 and 9.25 will be shown as 9.25 and that will reorder remaining 0.00 so this isn't advice (note that for numbers you have 4 digits not counting delimiter (.) and it is your how will you arrange them)...
(note also that in your sj.dat :
sj.dat
1 -10;8 -8.25; 12 -3.18; 30 -1.97; 151 -1.84
11 -10;81 8.25; 121 3.18; 35 -1.97
28 15; 101 -78
you should have one space after ; so it should be :
sj.dat
1 -10; 8 -8.25; 12 -3.18; 30 -1.97; 151 -1.84
11 -10; 81 8.25; 121 3.18; 35 -1.97
28 15; 101 -78
)
Sincerely, M.R.