JPV
JPV

Reputation: 1079

read input file Matlab

I have a problem while reading an input file in Matlab. It appears that all the rows have one parameter input except for the last one which is a vector:

INPUT FILE 
--------------
Field1: number
Field2: text (one word)
Field3: number
Field4: number
Field5: number
Field6: number
Field7: vector

The code I have implemented looks like:

fid = fopen('input.inp','r');
A = textscan(fid,'%s %f','Delimiter','\t','headerLines',2);
data = cat(2,A{:});

I would like some help to deal with the fact that I have some text/number cases and also to deal with the vector form the last row. Thanks

Upvotes: 0

Views: 300

Answers (1)

kkuilla
kkuilla

Reputation: 2256

Is this what you are looking for...?

I think you have to use %s %s as a format to text scan and not a float because a vector cannot be converted to a float for example.

I changed this A = textscan(fid,'%s %s','Delimiter','\t'); to include %s %s. Also, I think you want to concatenate along the first dimension rather than the second.

I think you actually want to create a key/value pair of the input file rather than just reading each row into a cell but you don't state that.

INPUT FILE 
--------------
Field1: 1
Field2: two
Field3: 3
Field4: 4
Field5: 5
Field6: 6
Field7: [7 8 9]


fid = fopen('D:\tmp\t.txt','r');
A = textscan(fid,'%s %s','Delimiter','\t','headerLines',2);


cat(1,A{:})
ans =
{
  [1,1] = Field1: 1
  [2,1] = Field3: 3
  [3,1] = Field5: 5
  [4,1] = Field7: [7 8 9]
  [5,1] = Field2: two
  [6,1] = Field4: 4
  [7,1] = Field6: 6
}

If you want to create a key/value pair, then you can split them into key and value with a loop that you can use with the Container class if needed. You have to filter your strings a bit (e.g remove colons etc) but you get the gist.

keySet = {};
valueSet = {};
for (n=1:size(A2,1))
    s = A2{n};
    ind = strfind(s,' ');  
    keySet{n} = s(1:ind(1));
    valueSet{n} =s(ind(1):end);
end

The output is

keySet =
{
  [1,1] = Field1:
  [1,2] = Field3:
  [1,3] = Field5:
  [1,4] = Field7:
  [1,5] = Field2:
  [1,6] = Field4:
  [1,7] = Field6:
}

valueSet =
{
  [1,1] =  1
  [1,2] =  3
  [1,3] =  5
  [1,4] =  [7 8 9]
  [1,5] =  two
  [1,6] =  4
  [1,7] =  6
}

From the Container class doc:

mapObj = containers.Map(keySet,valueSet)

Upvotes: 2

Related Questions