The following code was used to bulk parse a set of author names in the form of:
firstname [middlename] lastname, [firstname middlename lastname] ...
Prerequisites:
-
An APEX collection created with the name of AUTHORS
-
An APEX textarea item with the name Pnnn_AUTHOR_STRING.
-
A button with request name PARSE_AUTHORS
The author names are parsed and added as members to an APEX collection. This was designed for a specific purpose but the code may be able to modified to fit different situations.
Step 1: create an APEX item called Pnn_AUTHOR_STRING as textarea.
Step 2: Add a button called PARSE_AUTHORS
Step 3: Add a submit process that executes when the button is pressed with the following code:
DECLARE
l_rank number;
l_str varchar2(4000);
CURSOR STR IS
select
trim(regexp_substr(name, '^[^ ]*')) first,
trim(regexp_substr(name, ' .*[ ]')) middle,
trim(regexp_substr(name, '[^ .]*$')) last
--dump(name) first, null middle, null last
from
(select trim(regexp_substr(l_str,'[^,]+', 1, level)) name from dual
connect by regexp_substr(l_str, '[^,]+', 1, level) is not null);
BEGIN
SELECT NVL(MAX(TO_NUMBER(C002))+1,1) INTO l_rank
FROM APEX_COLLECTIONS
WHERE COLLECTION_NAME = 'AUTHORS';
-- Take out carraige returns, replace with space
l_str := :P29_AUTHOR_STRING;
l_str := replace(:P29_AUTHOR_STRING,chr(13) || chr(10),chr(32));
-- temporarily change that crazy character to something we know
l_str := replace(l_str,chr(164),'!');
-- strip out the superscript letters
l_str := regexp_replace(l_str,'! *[a-z]*','');
-- remove any special characters
l_str := regexp_replace(l_str,'[^a-zA-Z,. ]','',1,0,'i');
-- trim returns
l_str := trim(chr(32) from l_str);
-- remove multiple spaces
l_str := regexp_replace(l_str, '( ){2,}','\1' );
l_str := trim(l_str);
FOR C1 IN STR LOOP
APEX_COLLECTION.ADD_MEMBER(p_collection_name => 'AUTHORS',
p_c001 => 'NEW',
p_c002 => l_rank,
p_c003 => NULL,
p_c004 =>
trim(C1.LAST || ', ' ||
C1.FIRST || ' ' ||
C1.MIDDLE),
p_c005 => 'AUTHOR',
p_c006 => NULL,
p_c007 => C1.FIRST,
p_c008 => C1.MIDDLE,
p_c009 => C1.LAST,
p_c010 => NULL,
p_c011 => NULL,
p_generate_md5 => 'YES');
l_rank := l_rank + 1;
END LOOP;
END;
Optionally, while testing, you might want to create a classic report based on the collection.
