2013-08-22 25 views
1

我想讀其中的格式爲文本掃描到未知數量的變量和運行

Var1 Val1A Val1B ... Val1Q 
    Var2 Val2A Val2B ... Val2Q 
    ... 

一個CSV文件,我不知道時間提前的未知讀取數量有多少變數(行)或文件中有多少次運行(列)。

我一直在試圖讓文本掃描工作,但無論我嘗試什麼,我無法獲得所有變量名稱孤立或行列單元格數組。這是我一直在嘗試的。

fID = fopen(strcat(pwd,'/',inputFile),'rt'); 

    if fID == -1 
     disp('Could not find file') 
     return 
    end 

    vars = textscan(fID, '%s,%*s','delimiter','\n'); 
    fclose(fID); 

有沒有人有建議?

回答

0

對於任何給定的文件,所有的行都是等長的嗎?如果是的話,可以從第一行開始閱讀,然後用它來計算字段數量,然後使用textscan讀取文件。

fID = fopen(strcat(pwd,'/',inputFile),'rt'); 
firstLine = fgetl(fID); 
numFields = length(strfind(firstLine,' ')) + 1; 
fclose(fID); 

formatString = repmat('%s',1,numFields); 

fID = fopen(strcat(pwd,'/',inputFile),'rt'); 
vars = textscan(fID, formatString,' '); 
fclose(fID); 

現在您將擁有一個單元格數組,其中第一個條目是var名稱,其他所有條目都是觀察值。

在這種情況下,我認爲分隔符是空格,即使您說它是一個csv文件。如果它真的是逗號,則可以相應地更改代碼。

2

如果文件在每一行中的列數相同(您只是不知道開始的數量),請嘗試以下操作。

首先,通過解析正好位於第一行弄清楚有多少列,並找到列數,然後解析完整的文件:

% Open the file, get the first line 
fid = fopen('myfile.txt'); 
line = fgetl(fid); 
fclose(fid); 

tmp = textscan(line, '%s'); 
% The length of tmp will tell you how many lines 
n = length(tmp); 

% Now scan the file 
fid = fopen('myfile.txt'); 
tmp = textscan(fid, repmat('%s ', [1, n])); 
fclose(fid);