2014-11-17 2 views
0

У меня проблема при чтении входного файла в Matlab. Оказывается, что все строки имеют один вход параметров для последнего, который является вектором, кроме:чтение входного файла Matlab

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

Код я реализовал выглядит следующим образом:

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

Я хотел бы получить некоторую помощь, чтобы справиться с тот факт, что у меня есть некоторые текстовые/числовые случаи, а также для обработки векторной формы последней строки. Спасибо

+0

Было бы гораздо лучше, если вы реальные данные. Например, как выглядит ваш вектор в файле? – kkuilla

ответ

2

Это то, что вы ищете ...?

Я думаю, вы должны использовать %s %s как формат для сканирования текста, а не поплавок, потому что вектор не может быть преобразован в поплавок, например.

Я изменил это A = textscan(fid,'%s %s','Delimiter','\t');, чтобы включить %s %s. Кроме того, я думаю, вы хотите объединиться по первому измерению, а не по второму.

Я думаю, вы действительно хотите создать пару ключ/значение входного файла, а не просто считывать каждую строку в ячейку, но вы этого не утверждаете.

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 
} 

Если вы хотите создать пару ключ/значение, то вы можете разделить их на ключ и значение с петлей, которую можно использовать с Container класса, если это необходимо. Вы должны немного фильтровать свои строки (например, удалять двоеточие и т. Д.), Но вы получаете суть.

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 

Выход

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 
} 

От Container class doc:

mapObj = containers.Map(keySet,valueSet) 
Смежные вопросы