check the following. load whole lisp code.
;******************************************************************************************************************************************************
(defun get_csv_filename (/ csv_name_selected)
(setq csv_name_selected (strcat (vlax-get (vla-get-activedocument (vlax-get-acad-object)) 'Path)
"\\"
(if (and csv_filename (findfile csv_filename)) (vl-filename-base csv_filename) "")
)
)
(if (type acet-ui-getfile)
(setq csv_filename (acet-ui-getfile "Select CSV file" csv_name_selected "csv" "" 2))
(setq csv_filename (getfiled "Select CSV file" csv_name_selected "csv" 2))
)
(if (= "" csv_filename)
nil
csv_filename
)
)
;******************************************************************************************************************************************************
(defun string_to_list (input_string delimiter / delimiter_position output_list)
(if (= 'str (type input_string))
(progn
(while (setq delimiter_position (vl-string-search delimiter input_string 0))
(setq output_list (append output_list (list (substr input_string 1 delimiter_position)))
input_string (substr input_string (+ 2 delimiter_position))
)
)
(append output_list (list input_string))
)
nil
)
)
;******************************************************************************************************************************************************
(defun read_csv ( csv_filename / csv_id csv_string read_csv_list)
(setq csv_id (open csv_filename "r")
csv_string (read-line csv_id)
)
(while (setq csv_string (read-line csv_id))
(setq read_csv_list (append read_csv_list (list (string_to_list csv_string ","))))
)
(close csv_id)
read_csv_list
)
;******************************************************************************************************************************************************
(defun clean_list (_list / 1st_element cleaned_list)
(while (setq 1st_element (car _list))
(setq cleaned_list (append cleaned_list (list (car _list)))
_list (vl-remove-if '(lambda (element) (equal element 1st_element)) (setq _list (cdr _list)))
)
)
cleaned_list
)
;******************************************************************************************************************************************************
(defun find_closest_to (text list_to)
(list text
(cdar (vl-sort (mapcar '(lambda (text_to) (cons (distance (vlax-get text 'insertionpoint)
(vlax-get text_to 'insertionpoint)
)
text_to
)
)
list_to
)
'(lambda (pair_1 pair_2) (< (car pair_1) (car pair_2)))
)
)
)
)
;******************************************************************************************************************************************************
(defun c:find_beam_pairs (/ beam_text_list angle_list beam_page_list beam_type_list text_pair index_color)
(setq beam_text_list (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "text") (1 . "(*),ACRB*")))))))
angle_list (vl-sort (clean_list (mapcar 'vla-get-rotation beam_text_list)) '<)
beam_page_list (mapcar '(lambda (_angle) (vl-remove-if-not '(lambda (text) (and (equal _angle (vla-get-rotation text))
(wcmatch (vla-get-textstring text) "(*)")
)
)
beam_text_list
)
)
angle_list
)
beam_type_list (mapcar '(lambda (_angle) (vl-remove-if-not '(lambda (text) (and (equal _angle (vla-get-rotation text))
(wcmatch (vla-get-textstring text) "ACRB*")
)
)
beam_text_list
)
)
angle_list
)
index_color 0
)
(mapcar '(lambda (pair) (princ (car pair)) (princ ",") (princ (cadr pair)) (princ "\n"))
(cons '( "\nBEAM" "Page No")
(vl-sort (apply 'append
(mapcar '(lambda (type_sublist page_sublist) (mapcar '(lambda (type_entry) (mapcar 'vla-get-textstring
(progn
(setq text_pair (find_closest_to type_entry page_sublist)
index_color (1+ index_color)
)
(mapcar '(lambda (text) (vla-put-color text index_color))
text_pair
)
text_pair
)
)
)
type_sublist
)
)
beam_type_list
beam_page_list
)
)
'(lambda (beam_1 beam_2) (< (car beam_1) (car beam_2)))
)
)
)
(princ)
)
;******************************************************************************************************************************************************
(defun c:change_beam_pages (/ csv_filename csv_list beam_text_list angle_list beam_page_list beam_type_list beam_page_list text_pair new_page)
(if (and (setq csv_filename (get_csv_filename))
(setq csv_list (read_csv csv_filename))
)
(progn
(setq beam_text_list (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget '((0 . "text") (1 . "(*),ACRB*")))))))
angle_list (vl-sort (clean_list (mapcar 'vla-get-rotation beam_text_list)) '<)
beam_page_list (mapcar '(lambda (_angle) (vl-remove-if-not '(lambda (text) (and (equal _angle (vla-get-rotation text))
(wcmatch (vla-get-textstring text) "(*)")
)
)
beam_text_list
)
)
angle_list
)
beam_type_list (mapcar '(lambda (_angle) (vl-remove-if-not '(lambda (text) (and (equal _angle (vla-get-rotation text))
(wcmatch (vla-get-textstring text) "ACRB*")
)
)
beam_text_list
)
)
angle_list
)
beam_page_list (apply 'append
(mapcar '(lambda (type_sublist page_sublist) (mapcar '(lambda (type_entry) (progn (setq text_pair (find_closest_to type_entry page_sublist))
(list (vla-get-textstring (car text_pair)) (cadr text_pair))
)
)
type_sublist
)
)
beam_type_list
beam_page_list
)
)
)
(foreach csv_row csv_list
(if (setq new_page (caddr csv_row)) (vla-put-textstring (cadr (assoc (car csv_row) beam_page_list)) (strcat "(" new_page ")"))
)
)
)
)
(princ)
)
;******************************************************************************************************************************************************
1. run find_beam_pairs. it will find and color each pair with 1-incremented index color starting 1 (red).

2. check if all pairs complete. beam ACRB072* has 2 pages near to it. i just moved its (4) page closer to insertion point to exclude missing pair.

3. run find_beam_pairs again to check every pair is correct.

4. run change_beam_pages to change each beam page according to Change to Page no. column in the csv file.

you've got it.