如何在MATLAB中提取带双引号的CSV数值并实现绘图?
解决MATLAB读取带全双引号CSV时数值变成字符的问题
嘿,我之前也处理过这种所有内容都被双引号包裹的CSV文件,给你几个亲测有效的方案:
方案1:用readtable读取后批量转换数值列
这种方法适合已经明确哪些列是数值型的情况,先把所有内容读成string类型,再批量转数值:
% 读取CSV文件,指定TextType为string,自动处理引号 raw_table = readtable('full_webstats_credit_gap_dataflow.csv', 'TextType', 'string'); % 假设从第2列开始是数值列(根据你的实际数据结构调整) numeric_col_indices = 2:width(raw_table); % 对数值列应用str2double转换 raw_table(:, numeric_col_indices) = varfun(@str2double, raw_table(:, numeric_col_indices)); % 现在可以直接提取数值数据绘图了 plot(raw_table{:, 2});
原理是readtable用TextType='string'读取时,会自动去掉双引号得到纯净字符串,str2double能直接把这些字符串转成数值。
方案2:用textscan配合cellfun转换
如果需要更精细控制读取过程,可以用textscan先按带引号的字符串读取,再批量转换:
fid = fopen('full_webstats_credit_gap_dataflow.csv', 'r'); % 先读取表头(假设表头有6列,根据你的文件实际列数调整) header = textscan(fid, '%q', 6); % 读取数据行,每列都用%q读取(自动去掉引号) data_cells = textscan(fid, repmat('%q', 1, 6), 'Delimiter', ','); fclose(fid); % 将数值列的元胞数组转成数值矩阵(这里假设第2到第6列是数值) numeric_matrix = cellfun(@str2double, [data_cells{2:end}]); % 绘图示例 plot(numeric_matrix(:, 1));
%q格式符会专门处理带双引号的字段,读取后自动去除引号,得到的字符串可以直接用str2double转换。
方案3:预处理文件去掉所有双引号
如果文件所有内容都带引号,最简单的方式是先把所有双引号删掉,再用普通方法读取:
% 读取整个文件内容 file_text = fileread('full_webstats_credit_gap_dataflow.csv'); % 替换掉所有双引号 clean_text = strrep(file_text, '"', ''); % 写入临时文件 temp_file = 'temp_cleaned.csv'; fid = fopen(temp_file, 'w'); fwrite(fid, clean_text); fclose(fid); % 现在可以用readtable或csvread正常读取 clean_table = readtable(temp_file); % 用完删除临时文件(可选) delete(temp_file); % 绘图 plot(clean_table{:, 2});
这个方法最省心,适合所有字段都被引号包裹的场景,处理后文件就和普通CSV完全一样了。
注意事项
- 转换前先确认哪些列是数值列,别把文本列(比如"Private non-financial sector")拿去转数值,会得到NaN;
- 如果有缺失值,
str2double会返回NaN,可以用isnan检查并做相应处理。
内容的提问来源于stack exchange,提问作者litmus
相关产品推荐
相关产品推荐

