Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

To resolve issues starting MATLAB on Mac OS X 10.10 (Yosemite) visit: http://www.mathworks.com/matlabcentral/answers/159016

map first field to second field in txt file

Asked by huda nawaf on 31 Jul 2012

hi,

I have this txt file :

1::Toy Story (1995) ::Animation|Children's|Comedy

2::Jumanji (1995) ::Adventure|Children's|Fantasy

8::Tom and Huck (1995) ::Adventure|Children's

I want to map for example 1 into animation, and 2 into adventure 8 into adventure i.e ,i need creat txtfile has two columns , the first column contains 1,2,8 and second column contains animation,adventure,adventure

please, how do that thanks in advance

0 Comments

huda nawaf

Tags

Products

No products are associated with this question.

2 Answers

Answer by per isakson on 31 Jul 2012
Edited by per isakson on 5 Aug 2012
Accepted answer

A slight modification of the textscan command I provided to your question the other day will read the file. (You never explained how "::" should be interpreted.) What do you mean by "I read each filed alone of a one row, textscan do not work with it."? If you don't need a column add "*" after "%", e.g. "%*d" to suppress the first column.

Thus

    >> cac = txt2m
    cac = 
        [3x1 int32]    {3x1 cell}    {3x1 cell}
    >> cac{:}
    ans =
               1
               2
               8
    ans = 
        'Toy Story (1995) '
        'Jumanji (1995) '
        'Tom and Huck (1995) '
    ans = 
        'Animation|Children's|Comedy'
        'Adventure|Children's|Fantasy'
        'Adventure|Children's'
    >> 

where the function, txt2m, is given by

    function    cac = txt2m()
    %%
    fid = fopen('cssm.txt');
    cac = textscan( fid, '%d%s%s'                       ...
                ,   'Delimiter'             ,   ':'     ...
                ,   'CollectOutput'         ,   false   ...
    ...         ,   'EmptyValue'            ,   -999    ...
    ...         ,   'ExpChars'              ,   ''      ...
                ,   'MultipleDelimsAsOne'   ,   true    ... 
                ,   'Whitespace'            ,   ''      );
    fclose( fid );    
    end

then regexp and str2num

    >> regexp( cac{2}, '\d{4}', 'match' )
    ans = 
        {1x1 cell}
        {1x1 cell}
        {1x1 cell}
    >> ans{:}
    ans = 
        '1995'
    ans = 
        '1995'
    ans = 
        '1995'

--- In response to the answer below ---

This modified function, txt2m, reads and parses your file. It reads the file to a string with the function, fileread (thanks Walter, I didn't know of that one), and replaces "::" by "¤" (knock on wood). I just picked a character on the keyboard.

Try

>> cac = txt2m()
cac = 
    [13x1 int32]    {13x1 cell}    {13x1 cell}
>> 

where

cssm.txt contains your 13 rows

and where

function    cac = txt2m()
%%
str = fileread( 'cssm.txt' );
str = strrep( str, '::', '¤' );
%%
cac = textscan( str, '%d%s%s'                       ...
            ,   'Delimiter'             ,   '¤'     ...
            ,   'CollectOutput'         ,   false   ...
...         ,   'EmptyValue'            ,   -999    ...
...         ,   'ExpChars'              ,   ''      ...
            ,   'MultipleDelimsAsOne'   ,   true    ... 
            ,   'Whitespace'            ,   ''      );
end

13 Comments

huda nawaf on 3 Aug 2012

THANKS, i corrected the error, and I did what you suggested but the problem is not solved.

per isakson on 3 Aug 2012
  1. What did you do? What does your new code look like?
  2. How does it behave? What output? What error message?

Why do you expect me to guess?

per isakson on 4 Aug 2012

Why don't you care to respond?

per isakson
Answer by huda nawaf on 4 Aug 2012
Edited by Walter Roberson on 4 Aug 2012

I just need to read txtfile with this format:

1::Toy Story (1995) ::Animation|Children's|Comedy

2::Jumanji (1995) ::Adventure|Children's|Fantasy

8::Tom and Huck (1995) ::Adventure|Children's

there is no error message , but I have 3000 rows ,when I read it use the code u sent it earlier I got just first 12 rows?

I want to map first fiels into the first word of third field

ex. 1 Animation 2 Adventure 8 Adventure

this is what I need . the first 13 rows of my file:

1::Toy Story (1995)::Animation|Children's|Comedy
2::Jumanji (1995)::Adventure|Children's|Fantasy
3::Grumpier Old Men (1995)::Comedy|Romance
4::Waiting to Exhale (1995)::Comedy|Drama
5::Father of the Bride Part II (1995)::Comedy
6::Heat (1995)::Action|Crime|Thriller
7::Sabrina (1995)::Comedy|Romance
8::Tom and Huck (1995)::Adventure|Children's
9::Sudden Death (1995)::Action
10::GoldenEye (1995)::Action|Adventure|Thriller
11::American President, The (1995)::Comedy|Drama|Romance
12::Dracula: Dead and Loving It (1995)::Comedy|Horror
13::Balto (1995)::Animation|Children's

thanks

3 Comments

Walter Roberson on 4 Aug 2012

textscan() will not work for this, at least not as-is. You can read the file (such as by using fileread() ) and then use regexp() to parse it.

per isakson on 4 Aug 2012

See my answer above. I hope the lines you don't show don't contain "¤".

huda nawaf on 5 Aug 2012

thanks for both walter and per. lastly, I got what I need by your efforts

huda nawaf

Contact us