2013-10-18 47 views
2

我有一個1911518值的數據集。我已經使用了textscan功能。但該函數僅返回1424458個值。我再次創建了一個新變量來獲得剩餘的值,但是這次它給了我大約9000個值。有誰知道這可能是什麼原因?無法使用TextScan一次性在Matlab中導入所有值

n=9 
N=1911518 

file_id=fopen('CRSP.csv'); 

C=textscan(file_id,'%s',n,'delimiter', ','); %To get the headers 
C_text=textscan(file_id,'%s %s %s %d %d %d %d %f %f',N, 'delimiter' , ','); 

%Returns 1424458 

C_text1=textscan(file_id,'%s %s %s %d %d %d %d %f %f',N, 'delimiter' , ','); 

%Returns only 9000 values  

fclose(file_id); 

樣本數據

DATE,COMNAM,TICKER,PERMNO,PERMCO,SHROUT,VOL,RET,sprtrn 

01/02/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 23700, 0.000000, 0.007793 
01/03/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 20800, 0.020000, 0.000950 
01/04/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 65300, -0.026144, -0.005826 
01/05/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 340600, 0.000000, -0.001587 
01/08/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 3400, 0.000000, 0.002821 
01/09/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 27200, -0.006711, -0.014568 
01/10/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 25400, -0.033784, -0.018000 
01/11/1996, ACME CLEVELAND CORP NEW, AMT, 10057, 20020, 6313, 14000, 0.000000, 0.007034 
+1

您需要提供一些示例數據,否則很難爲您提供幫助;) – thewaywewalk

+0

我不知道上述示例將提供多少幫助:P – user2848498

+0

如果換行符不丟失,它將有所幫助。請編輯您的問題,並將數據和代碼添加爲「代碼示例」。這將保留所有線路制動器。 – Daniel

回答

2

我會假設,有一些錯誤的數據,或格式模式不匹配的數據。嘗試提取這些行:

file_id=fopen('CRSP.csv'); 
for idx=1:1424456 
    fgetl(file_id); %dump data 
end 
for idx=1:10 
    fprintf('%s\n',fgetl(file_id)); 
end 

如果有錯誤,它應該在第2或第3行打印行。那裏有什麼特別的?也許COMNAM與一些特殊字符?

讀取該文件,我會用下面的代碼按行讀入行:

file_id=fopen('CRSP.csv'); 
line=fgetl(file_id); 
data={}; 
int ix=1; 
while(ischar(line)) 
    [parsed,sindex,eindex] = regexpi(line,'(\d\d/\d\d/\d\d\d\d)\s*, ([\w ]+), ([\w ]+), ([\d]+), ([\d]+), ([\d]+), ([\d]+), ([\d \.]+), ([\d \.]+)','tokens') 
    if ~isempty(sindex)&&numel(sindex)==1&&(sindex==1)&&(eindex==numel(x)) 
     data{end+1}=parsed{1}; 
    else 
     fprintf('Unable to parse line %d with content: %S',ix,line); 
    end 
    line=fgetl(file_id); 
    ix=ix+1; 
end 

正則表達式的簡短總結:

「(...)」一切都之間的「令牌「

'([\ d。] +)'Numbers,white space and」。「

'([\ d。] +)' 數字和空格

'([\ W] +)' 字,包括空白

「(\ d \ d/\ d \ d/d \ d \ d \ d \ d)'日期

這個表達式有點「懶」。它不僅接受「0.000」作爲數字,而且接受「0.0 00」。或其他一些組合,但它應該足以檢測所有錯誤。否則,表達式必須改進。

+0

你是對的,在數據​​中有一些錯誤的值。例如sprrtn,有字符串值。但我認爲只是將所有值提取到matlab中,然後檢查NAs或infs – user2848498

+0

現在,我發現有錯誤值,我如何刪除它們並存儲剩餘的值而不破壞順序 – user2848498

+0

我更新了我的答案。使用textscan也可能有一個更簡單的解決方案,但我只是習慣於正則表達式。 – Daniel

1

Daniel R的回答基本上是正確的。爲了詳細說明(我會張貼這個評論,但我缺乏聲譽),在MATLAB中的textscan是非常挑剔的,它基本上保存了,每當它遇到一些不符合你指定的格式。

如果你有一個可能包含一些錯誤或不一致的數據文件,你的主要選擇是以某種方式預處理文件以刪除這些錯誤,或者(如Daniel建議)自己在線閱讀文件不管你想要什麼,都可以解析它。前者可能與後者差不多,除非你打算手動完成,並且沒有太多的錯誤需要修復,所以在大多數情況下,編寫自己的解析器可能會更容易。

你可能會做的唯一的其他事情 - 如果唯一的錯誤是類型錯誤(例如列應該是一個整數,但有時浮點數字滑入),你仍然可以使用textscan並替換具有更通用的格式說明符。例如,在那個例子中,你可以用%f(浮點數)替代%d(整數)。由於所有整數都是浮點數,所以應該可以正常工作。在最極端的情況下,您可以將所有列讀作字符串(%s),但是無論如何您都需要解析它們,而且您可能更好地在沒有textscan的情況下執行此操作。

+0

如何刪除錯誤。你能幫助我解釋如何擺脫有錯誤的列 – user2848498

相關問題