2010-01-11 129 views
6

Tôi đã viết tập lệnh lưu đầu ra của nó vào tệp CSV để tham khảo sau này, nhưng tập lệnh thứ hai để nhập dữ liệu mất một khoảng thời gian vô hạn để đọc lại.Cách nhanh nhất để nhập tệp CSV trong MATLAB

các dữ liệu có định dạng sau:

Item1,val1,val2,val3 
Item2,val4,val5,val6,val7 
Item3,val8,val9 

nơi các tiêu đề là trên cột bên trái nhất, và các giá trị dữ liệu mất thời gian còn lại của hàng. Một khó khăn lớn là mảng các giá trị dữ liệu có thể có độ dài khác nhau cho từng mục kiểm tra. Tôi muốn lưu nó như là một cấu trúc, nhưng tôi cần để có thể chỉnh sửa nó bên ngoài môi trường MATLAB, vì đôi khi tôi phải xóa các hàng dữ liệu xấu trên một máy tính không được cài đặt MATLAB. Vì vậy, thực sự, một phần của câu hỏi của tôi là: Tôi có nên lưu dữ liệu ở định dạng khác không?

Phần thứ hai của câu hỏi: Tôi đã thử importdata, csvreaddlmread, nhưng tôi không chắc cái nào là tốt nhất hoặc nếu có giải pháp tốt hơn. Hiện tại, tôi đang sử dụng tập lệnh của riêng mình bằng cách sử dụng vòng lặp và fgetl, tốc độ này rất chậm đối với các tệp lớn. Bất kỳ đề xuất?

function [data,headers]=csvreader(filename); %V1_1 
fid=fopen(filename,'r'); 
data={}; 
headers={}; 
count=1; 
while 1 
     textline=fgetl(fid); 
     if ~ischar(textline), break, end 
     nextchar=textline(1); 
     idx=1; 
     while nextchar~=',' 
     headers{count}(idx)=textline(1); 
     idx=idx+1; 
     textline(1)=[]; 
     nextchar=textline(1); 
     end 
     textline(1)=[]; 
     data{count}=str2num(textline); 
     count=count+1; 
end 
fclose(fid); 

(Tôi biết mã lẽ là khủng khiếp bằng văn bản này - Tôi là một kỹ sư, không phải là một lập trình viên, xin đừng la mắng tôi -. Bất kỳ đề xuất cải tiến sẽ được hoan nghênh, mặc dù)

Trả lời

10

nó có lẽ sẽ làm cho dữ liệu dễ dàng hơn để đọc nếu bạn có thể pad các tập tin với NaN giá trị khi kịch bản đầu tiên của bạn tạo ra nó:

Item1,1,2,3,NaN 
Item2,4,5,6,7 
Item3,8,9,NaN,NaN 

hoặc thậm chí bạn có thể chỉ cần in các lĩnh vực có sản phẩm nào:

Item1,1,2,3, 
Item2,4,5,6,7 
Item3,8,9,, 

Tất nhiên, để đệm đúng cách, bạn cần phải biết số lượng giá trị tối đa trên tất cả các mục là trước khi tay. Với một trong hai định dạng trên, sau đó bạn có thể sử dụng một trong những chức năng đọc file tiêu chuẩn, như TEXTSCAN ví dụ:

>> fid = fopen('uneven_data.txt','rt'); 
>> C = textscan(fid,'%s %f %f %f %f','Delimiter',',','CollectOutput',1); 
>> fclose(fid); 
>> C{1} 

ans = 

    'Item1' 
    'Item2' 
    'Item3' 

>> C{2} 

ans = 

    1  2  3 NaN %# TEXTSCAN sets empty fields to NaN anyway 
    4  5  6  7 
    8  9 NaN NaN 
3

Thay vì phân tích các chuỗi textline một ký tự cùng một lúc. Bạn có thể sử dụng strtok để phá vỡ chuỗi lên ví dụ

stringParts = {}; 
tline = fgetl(fid); 
if ~ischar(tline), break, end 
i=1; 
while 1 
    [stringParts{i},r]=strtok(tline,','); 
    tline=r; 
    i=i+1; 
    if isempty(r), break; end 
end 

% store the header 
headers{count} = stringParts{1}; 

% convert the data into numbers 
for j=2:length(stringParts) 
    data{count}(j-1) = str2double(stringParts{j}); 
end 
count=count+1; 
+0

+1 để giới thiệu strtok - Tôi không biết nó tồn tại trước – Doresoom

0

Q1) Nếu bạn biết số lượng tối đa của cột bạn có thể điền vào các mục trống với NaN Ngoài ra, nếu tất cả các giá trị là số, bạn có thực sự cần Cột "MụC#"? Nếu có, bạn chỉ có thể sử dụng "#", vì vậy tất cả dữ liệu đều là số.

Q2) Cách nhanh nhất để đọc num. dữ liệu từ một tệp không có tệp mex là csvread. tôi cố gắng tránh sử dụng chuỗi trong file csv, nhưng nếu tôi phải, tôi sử dụng chức năng csv2cell tôi:

http://www.mathworks.com/matlabcentral/fileexchange/20135-csv2cell

+0

Cột MụC# thực sự là nhãn văn bản, vì vậy có, tôi cần nó. Có lẽ tôi nên làm rõ điều đó. – Doresoom

1

Tôi đã có cùng một vấn đề với đọc dữ liệu csv trong Matlab, và tôi đã rất ngạc nhiên bằng cách hỗ trợ rất ít cho điều này, nhưng sau đó tôi chỉ tìm thấy công cụ nhập dữ liệu. Tôi đang ở r2015b.

Trên thanh trên cùng trong tab "Trang chủ", nhấp vào "Nhập dữ liệu" và chọn tệp bạn muốn đọc.Một cửa sổ ứng dụng sẽ xuất hiện như thế này:

Import Data tool screenshot

Dưới "Import Lựa chọn" bạn có tùy chọn để "tạo ra chức năng", trong đó cung cấp cho bạn khá nhiều lựa chọn tùy biến, bao gồm cách điền vào ô trống, và bạn muốn cấu trúc dữ liệu đầu ra như thế nào. Cộng với nó được viết bởi MathWorks, vì vậy nó có thể sử dụng phương pháp có sẵn nhanh nhất để đọc các tệp csv. Nó gần như tức thời trong hồ sơ của tôi.

Các vấn đề liên quan