I realize the question says version 12.1.0.2, but I hope anyone who has the same question using a more recent version will consider using SQL/JSON - as a first step toward replacing all those CSV strings with JSON arrays!
with data(x) as (
select '' from dual union all
select ',' from dual union all
select ',,' from dual union all
select ',,,' from dual union all
select ',,c' from dual union all
select ',,c,' from dual union all
select ',b' from dual union all
select ',b,' from dual union all
select ',b,,' from dual union all
select ',b,c' from dual union all
select ',b,c,' from dual union all
select 'a' from dual union all
select 'a,' from dual union all
select 'a,,' from dual union all
select 'a,,,' from dual union all
select 'a,,c' from dual union all
select 'a,,c,' from dual union all
select 'a,b' from dual union all
select 'a,b,' from dual union all
select 'a,b,,' from dual union all
select 'a,b,c' from dual union all
select 'a,b,c,' from dual union all
select 'a,b,c,d' from dual
)
select nvl(x, '(null)') x,
nvl(a, '(null)') a,
nvl(b, '(null)') b,
nvl(c, '(null)') c,
nvl(d, '(null)') d
from data, json_table(
replace(json_array(x), ',', '","'), '$' columns
a path '$[0]',
b path '$[1]',
c path '$[2]',
d path '$[3]'
);
X A B C D
(null) (null) (null) (null) (null)
, (null) (null) (null) (null)
,, (null) (null) (null) (null)
,,, (null) (null) (null) (null)
,,c (null) (null) c (null)
,,c, (null) (null) c (null)
,b (null) b (null) (null)
,b, (null) b (null) (null)
,b,, (null) b (null) (null)
,b,c (null) b c (null)
,b,c, (null) b c (null)
a a (null) (null) (null)
a, a (null) (null) (null)
a,, a (null) (null) (null)
a,,, a (null) (null) (null)
a,,c a (null) c (null)
a,,c, a (null) c (null)
a,b a b (null) (null)
a,b, a b (null) (null)
a,b,, a b (null) (null)
a,b,c a b c (null)
a,b,c, a b c (null)
a,b,c,d a b c d
Best regards,
Stew