一、CSV文件的讀取
readtable是MATLAB中強大的數據導入函數之一。它可以讀取各種文件形式(如CSV,TXT等等)的表格數據。對於CSV文件而言,readtable可以做到很好的讀取,特別是一些具有複雜表頭的CSV文件。
% 讀取具有表頭的CSV文件 filename = 'example.csv'; opts = detectImportOptions(filename); data = readtable(filename, opts);
在這個例子中,MATLAB會自動檢測CSV文件中的數據類型,並將它們讀入一個名為data的table類型變量中。特別的,opts的選項可以實現對錶頭的讀取。當選項detectImportOptions檢測到表頭時,就會將其解析為MATLAB的變量名。
二、csvread與readtable的比較
csvread是MATLAB中讀取CSV文件的另一種方法。在讀取csv文件時,通常會先想到csvread函數。但是,在面對複雜表頭、缺失值等問題時,csvread的局限性便會顯露。這時,使用readtable便能夠產生很好的效果。
% csvread示例代碼 A = csvread('example.csv', 1, 0);
csvread函數讀取CSV文件時,默認所有數據類型為double。因此,讀取到的CSV文件被強制轉換為數值類型。相比之下,當使用readtable函數時,MATLAB可以在運行時加載數據,從而將不同的數據類型轉換為單獨的列。此外,readtable函數還可以處理較大的數據集(即1e5行或更多)。
三、導入結構體數組
另外,readtable不僅可以讀取表格數據,還可以將其中非表格數據轉換為結構體數組。這個特性對於將各種輸出格式整合為一種實用的輸出格式時非常有用。例如,下面代碼示例將導入一個包含身高、體重和BMI的數據集,該數據集以結構體數組的形式存在。
% 導入結構體數組 filename = 'example_data.csv'; opts = detectImportOptions(filename, 'FileType', 'text'); opts.DataLines = [2, Inf]; opts.VariableTypes = {'string', 'double', 'double'}; opts.VariableNames = {'Name', 'Height', 'Weight'}; data = readtable(filename, opts); people = struct('Name', cellstr(data.Name), 'Height', data.Height, 'Weight', data.Weight); for i = 1:length(people) people(i).BMI = people(i).Weight / ((people(i).Height/100)^2); end
四、處理缺失值
在實際數據處理中,缺失值是經常出現的問題。readtable可以很好地處理這種情況。默認情況下,readtable會自動將缺失值標記為NaN。
% 處理缺失值的示例代碼 filename = 'example.csv'; opts = detectImportOptions(filename); opts = setvartype(opts, {'col_1', 'col_2'}, 'double'); opts.MissingRule = 'fill'; opts = setvaropts(opts, 'col_3', 'FillValue', 0); data = readtable(filename, opts);
在這個例子中,我們將col_1和col_2的數據類型設置為double,將缺失值的處理規則設置為填充(MissingRule = ‘fill’)。另外,我們將col_3的填充值設置為0。這些選項都控制了readtable如何處理缺失值。
五、讀取大型文件
在處理大型文件時,readtable的性能也很高。同時,readtable也支持自動化並行處理(Parallel Computing Toolbox)。這意味着readtable可以將CSV文件自動分割成更小的數據塊,然後並行處理這些數據塊。
% 讀取大型文件的示例代碼 filename = 'large_file.csv'; opts = delimitedTextImportOptions('DataLines',[2, Inf]); opts = setvaropts(opts, 'Column1', 'TrimNonNumeric', true); opts = setvaropts(opts, 'Column2', 'TrimNonNumeric', true); opts.SelectedVariableNames = {'Column1', 'Column2'}; % 使用並行 computing toolbox tStart = tic; data = readtable(filename, opts, 'UseParallel', true); toc(tStart)
在這個例子中,我們使用選項delimitedTextImportOptions限制僅導入數據。然後,我們針對Column1和Column2設置了選項TrimNonNumeric用於修整非數值類型的數據,避免後期錯誤。最後,我們通過設置UseParallel來使用並行計算。
六、readtable的局限性
在處理結構化數據時,readtable非常適合。而對於非規則結構的數據(如文本數據或像素數據),則要使用MATLAB中其他函數(如fread函數)來處理。
此外,當CSV文件中存在較長的注釋字符串時,readtable的解析速度也會變得非常慢。在這種情況下,需要手動處理字符串,使用正則表達式來解析注釋字符串。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/257220.html