Date: Jan 16, 2013 4:21 PM Author: Kevin Ellis Subject: Re: Help using textscan or sscanf dpb <none@non.net> wrote in message <kd6qtq$nu3$1@speranza.aioe.org>...

> On 1/16/2013 11:30 AM, Kevin Ellis wrote:

> > Hello,

> >

> > My problem is very simple, but I cannot find an efficient way to

> > accomplish it. Here is an excerpt of my array (which is one column of a

> > dataset):

> >

> > Subset001.AccountNumber(1:6,:)

> >

> > ans =

> > '154045001'

> > '926665001'

> > '615017'

> > '1976936151'

> > '801700'

> > '4506702001'

> >

> > I am trying to create a new account number in the form of a string. I

> > need to append '4412' to the the last 9 digits of the above account

> > numbers. So for the results is:

> >

> > '4412154045001'

> > '4412926665001' - Account Numbers have 9 digits so this is easy

> > '4412615017' - Only has 6 digits so take the whole account number

> > '4412976936151' - Has 10 digits so drop first and append to '4412'

> > etc.

> >

> > So my problem is difficult in that I need to use sscanf to find the last

> > 9 digits of the account number...

>

> Nope...

>

> >> s

> =strvcat('154045001','926665001','615017','1976936151','801700','4506702001');

> >> [repmat('4412',6,1) s(:,end-9:end)]

> ans =

> 4412154045001

> 4412926665001

> 4412615017

> 44121976936151

> 4412801700

> 44124506702001

> >>

>

> I'd suggest in the end it _might_ be better to "normalize" the account

> no's by prepending zeros for the short strings. Then they would sort,

> etc., more nearly normally (for at least one definition of "normal",

> anyway).

>

> --

dpb,

Thanks for attempting the solution. For those that may have the same problem, I found the following solution. It is ugly, but works. I am working with datasets so I first add another column to the dataset counting the length of each element in the account numbers column using:

Subset.Count = (cellfun('length',Subset.AccountNumber));

Then because I have a dataset, I can parse into two distinct datasets for when count is greater than 9 (account numbers with greater than 9 digits) and for when count is less than 9 (account numbers with less than 9 digits:

Subset9DigL = Subset(Subset.Count > 9,{'Type','AccountNumber',etc.});

Subset9DigH = Subset(Subset.Count <= 9,{'Type','AccountNumber',etc.});

Then just a couple lines using cellfun to create the new account number for each case:

Subset9DigL.DocNo = cellfun(@(x) strcat('4412',sscanf(x,'%s',1),'001'),...

Subset9DigL.AccoutNumber,'UniformOutput',false);

And

Expr = arrayfun(@(x) strcat('%*',num2str((x-9)),'c%9c'),Subset9DigH.Count,...

'UniformOutput',false);

Subset9DigH.DocNo = cellfun(@(x,y) strcat('4412',sscanf(x,y,1),'001'),...

Subset9DigH.AccoutNumber,Expr,'UniformOutput',false);

Then I just merge the two datasets once more:

Subset = cat(1,Subset9DigL,Subset9DigH);

And remove the Count column:

Subset.Count = [];

Again, a terrible way to do this, but if anyone can think of anything more innovative, that would be great.

Kevin