2012-05-18 36 views
1

是否有任何其他方式將Excel格式化的.csv導入Matlab而不是xlsread(file.csv);Matlab xlsread在行1048576之後切斷文件

我擁有的文件包含2830082行,並且xlsread在讀取時似乎有1048576行的限制 - 其餘部分被切斷。

文件看起來像:

Time, Value 
12:07:29, -1.13 
12:07:29, -7.54 
... 

因此,使用csvread(..)是不會因爲日期格式的工作。

+2

你可以試試我的[csvimport(http://www.mathworks.com/matlabcentral/fileexchange/23573-csvimport)功能;從來沒有嘗試過這樣大的文件,所以我很好奇,看看它是否工作:-) – Praetorian

+0

它適用於較小的測試文件,如魅力。我停止了它運行在一個大的,但它需要一段時間... – blitzen

+0

當然,這將需要一段時間,一個大文件。它完成了嗎?您可以在任務管理器中查看Matlab進程,以確定其是否掛起或仍在運行數據。 – Praetorian

回答

2

我發現將最大的csv文件讀入Matlab的最快方法是對它們進行內存映射並將內容解析爲單個字符串。試着用這個例子的代碼打:

fname = 'file.csv'; 
fstats = dir(fname); 
% Map the file as one long character string 
m = memmapfile(fname, 'Format', {'uint8' [ 1 fstats.bytes] 'asUint8'}); 
textdata = char(m.Data(1).asUint8); 

% Find the end of each line, and use the line ends to form an index array 
row = strfind(textdata, sprintf('\r\n')); 
row = [[1; row(1:end-1)'+2] row' - 1]; 
% Fix-up if there is no \r\n at the end of the last line 
if (row(end) < fstats.bytes - 2) 
    row = [row; [row(end) + 2, fstats.bytes]]; 
end 
numrows = size(row, 1); 
% Create output variables 
Time = zeros(numrows, 1); 
Value = zeros(numrows, 1); 

% Parse each line of the data (I'm ignoring the first line for simplicity) 
for RowNum = 2:numrows 
    data = textscan(textdata(row(RowNum,1):row(RowNum,2)), '%[^,]%f', 'delimiter', ','); 
    Time(RowNum) = datenum(data{:}); 
    Value(RowNum) = data{2}; 
end 

% Remove the file mapping 
clear('m');