Matlab中从含文本TXT提取两列数据并替换逗号为点的问题
问题描述
读取TXT文件数据时遇到以下需求与问题:
- TXT文件开头为文本/数字说明内容,后续是两列制表符分隔的数据,且数据使用逗号作为小数分隔符
- 需要提取这两列数据(剔除开头文本),并将逗号替换为小数点,用于后续绘图
尝试过的方法及存在的问题:
- 使用
importdata替换逗号时,会拆分每个字符,得到36k个元素,而非预期的2048个 - 使用
dlmread时,会忽略第二列数据
文件示例:
Data from FLMS012901__118__10-30-26-589.txt Node Date: Tue Jul 05 10:30:26 CEST 2022 User: Myself Number of Pixels in Spectrum: 2048 >>>>>Begin Spectral Data<<<<< 338,147 -2183,94 338,527 -2183,94 338,906 -2183,94 339,286 -2251,25
现有解决方案(速度偏慢)
% 读取文件为字符串序列 fid = fopen('data.txt', 'rb'); strings = textscan(fid, '%s', 'Delimiter', ''); fclose(fid); % 将所有逗号替换为小数点 decimal_strings = regexprep(strings{1}, ',', '.'); % 转换为双精度数并合并所有行 data = cellfun(@str2num, decimal_strings, 'uni', 0); data = cat(1, data{:});
优化解决方案
方案1:利用textscan精准定位数据并处理
先跳过开头文本,找到数据起始标记后直接读取,同时替换逗号为小数点:
fid = fopen('data.txt', 'r'); % 循环跳过文本行,直到找到数据起始标记 while ~feof(fid) line = fgetl(fid); if strcmp(line, '>>>>>Begin Spectral Data<<<<<') break; end end % 读取数据:支持制表符或空格作为列分隔符 data = textscan(fid, '%s %s', 'Delimiter', '\t '); fclose(fid); % 转换为数值数组并合并 col1 = str2double(regexprep(data{1}, ',', '.')); col2 = str2double(regexprep(data{2}, ',', '.')); final_data = [col1, col2];
方案2:使用readtable(MATLAB R2019b及以上版本)
利用导入配置直接处理小数分隔符与数据起始行:
% 生成导入配置 opts = detectImportOptions('data.txt'); % 设置变量类型与小数分隔符 opts = setvartype(opts, {'Var1','Var2'}, 'double'); opts = setvaropts(opts, {'Var1','Var2'}, 'DecimalSeparator', ','); % 指定从第7行开始读取数据(对应示例中标记行的下一行) opts.DataLines = [7, Inf]; % 支持制表符或空格作为列分隔符 opts.Delimiter = {'\t', ' '}; % 读取并转换为数组 final_data = table2array(readtable('data.txt', opts));
方案3:批量替换内容后读取(适合多文件场景)
先批量替换文件内的逗号为小数点,再读取数据:
% 读取文件全部内容 content = fileread('data.txt'); % 仅替换数据中的逗号为小数点(不修改文本说明部分) content = regexprep(content, '(\d+),(\d+)', '$1.$2'); % 写入临时文件 temp_file = 'temp_data.txt'; fid = fopen(temp_file, 'w'); fwrite(fid, content); fclose(fid); % 从第7行开始读取数据 data = dlmread(temp_file, '', 6, 0); % 删除临时文件 delete(temp_file);
内容的提问来源于stack exchange,提问作者gbon
相关产品推荐
相关产品推荐

