2012-10-15 123 views
0

我有一個巨大的csv文件(如:超過幾個演出),並希望在Matlab中讀取它並處理每個文件。讀取其全部文件是不可能的,所以我使用此代碼中的每一行改爲:Matlab:將單元格字符串(逗號分隔)轉換爲矢量

fileName = 'input.txt'; 
inputfile = fopen(fileName); 

while 1 
    tline = fgetl(inputfile); 
    if ~ischar(tline) 
     break 
    end 
end 
fclose(inputfile); 

這yiels尺寸(1,1)的與所述線串的單元陣列。我想要的是將這個單元格轉換爲只有數字的普通數組。 例如:

input.csv: 
0.0,0.0,3.201,0.192 
2.0,3.56,0.0,1.192 
0.223,0.13,3.201,4.018 

最終結果在Matlab用於第一行:

A = [0.0,0.0,3.201,0.192] 

我試圖轉換TLINE雙(TLINE),但是這會產生完全不同的結果。也嘗試使用正則表達式,但卡在那裏。我達到了將所有值分解到一個數組中的不同單元格的地步。但轉換爲雙str2double只產生NaNs ...

任何提示?最好沒有任何循環,因爲它已經花費一些時間來讀取整個文件。

+1

您是否試過爲CSV讀取指定'row','col'和'range'參數? – slayton

+0

好點,我會試試。 – Tim

+0

使用'str2num(tline)'而不是'str2double'。 –

回答

3

您正在尋找str2num

>> A = '0.0,0.0,3.201,0.192'; 
>> str2num(A) 
ans = 
    0 0 3.2010 0.1920 
>> A = '0.0 0.0 3.201 0.192'; 
>> str2num(A) 
ans = 
    0 0 3.2010 0.1920 
>> A = '0.0  0.0 , 3.201 , 0.192'; 
>> str2num(A) 
ans = 
    0 0 3.2010 0.1920 

例如,這是相當不可知的輸入格式。

但是,我不會建議您的用例。對於你的問題,我會做

C = dlmread('input.txt',',', [1 1 1 inf]) % for first line 
C = dlmread('input.txt',',')    % for entire file 

[a,b,c,d] = textread('input.txt','%f,%f,%f,%f',1) % for first line 
[a,b,c,d] = textread('input.txt','%f,%f,%f,%f') % for entire file 
如果你想在不同的變量所有列

a = 0 
b = 0 
c = 3.201 
d = 0.192 

fid = fopen('input.txt','r'); 
C = textscan(fid, '%f %f %f %f', 1); % for first line only 
C = textscan(fid, '%f %f %f %f', N); % for first N lines 
C = textscan(fid, '%f %f %f %f', 1, 'headerlines', N-1); % for Nth line only 
fclose(fid); 

所有這一切更容易擴展(比如th不管他們是什麼,隨着時間的推移會變得越來越大:)。尤其是dlmread比寫自己的子句更容易出錯,對於空行,缺失值和其他大多數數據集中常見的大麻煩。

+0

這似乎是我的問題的完美答案,但是,我無法使'inf'參數工作......它給出了一個錯誤: 非有限端點或增量爲冒號操作符在索引 – Tim

+0

@Tim:woops,似乎我沒有足夠徹底的測試。我現在沒有機會,但是你可以試試'C = dlmread('input.txt',',',1)'? (即沒有向量),或'C = dlmread('input.txt',',',1:10)'(對於前10行,希望:) –

+0

我試過但兩者都不起作用。我通過手動指定列範圍來修復它,因爲我從另一個矩陣中知道這一點(儘管這當然不是很模塊化)。 此外,我可以通過嘗試捕捉每一行來捕捉文件的結尾(因爲我不知道行範圍)可以通過文件讀取。 – Tim

0

嘗試

data = dlmread('input.txt',',') 

它會做你想要做什麼。

如果你仍然想字符串轉換成矢量:

line_data = sscanf(line,'%g,',inf) 

此代碼將讀取整個昏迷分隔串並轉換每個號碼。

相關問題