arrays - 在 MATLAB 中将混合数据元胞数组保存到 ascii 文件

标签 arrays matlab file-io save ascii

我从以特定方式格式化的仪器中获取一些数据。我需要将数据加载到 MATLAB 中,操作一些值,然后以相同的格式将其保存回仪器软件中以进行进一步分析...

我遇到的问题是数据是混合值类型,而且它们到处都是。

该文件是制表符分隔的,我添加了箭头,例如 --> 来显示制表符的位置(就像 notepad++ 那样)

Scan-42/01
Temperature [K] :-->   295.00
Time [s]        :-->     60

"Linspace"
0.01-->   0.96
0.02-->   0.95
0.03-->   0.95

"Logspace"
0.01-->   0.96
0.02-->   0.95
0.04-->   0.94

数据持续下降,但我在 3 行后将其切断。

我需要操作的数据是温度,以及LinspaceLogspace下的一些值。

我目前正在导入这样的数据:

filename = 'test.asc';
delimiter = '\t';
formatSpec = '%s%s%[^\n\r]';
fileID = fopen(filename,'r');
dataArray = textscan(fileID, formatSpec, 'Delimiter', delimiter, 'ReturnOnError', false);

MATLAB 中的数据如下所示:

.asc file loaded into MATLAB

即使我可以在 MATLAB 中设置某种模板,在其中可以获得必要的值,然后以这种格式保存它们,这种格式也可以正常工作。文件必须保存为.asc,否则仪器将拒绝它。

非常感谢您的帮助。

谢谢

最佳答案

希望这对您有用。

代码

%%// Note: file1 is your input .asc filename and file2 is the output .asc.
%%// Please specify their names before running this.

%%// **** Read in file data  **** 
fid = fopen(file1,'r');
A = importdata(file1,'\n')

%%// Delimiters (mind these assumptions)
linlog_delim1 = '-->   ';
temperature_delim1 = 'Temperature [K] :-->   ';

sep1 = cellfun(@(x) isequal(x,''),A)
sep1 = [sep1 ;1]
sep_ind = find(sep1)
full_data = regexp(A,linlog_delim1,'split')

%%// Temperature value
temp_ind = find(~cellfun(@isempty,strfind(A,'Temperature [K] :-->')))
temp_val = str2num(cell2mat(full_data{temp_ind,:}(1,2)))

%%// Linspace values
sep_linspace = cellfun(@(x) isequal(x,'"Linspace"'),A)
lin_start_ind = find(sep_linspace)+1
lin_stop_ind = sep_ind(find(sep_ind>lin_start_ind,1,'first'))-1

linspace_data = vertcat(full_data{lin_start_ind:lin_stop_ind})
linspace_valid_ind = cellfun(@str2num,linspace_data(:,1))
linspace_valid_val = cellfun(@str2num,linspace_data(:,2))

%%// Logspace values
sep_linspace = cellfun(@(x) isequal(x,'"Logspace"'),A)
log_start_ind = find(sep_linspace)+1
log_stop_ind = sep_ind(find(sep_ind>log_start_ind,1,'first'))-1

logpace_data = vertcat(full_data{log_start_ind:log_stop_ind})
logspace_valid_ind = cellfun(@str2num,logpace_data(:,1))
logspace_valid_val = cellfun(@str2num,logpace_data(:,2))

%%// ****  Let us modify some data ****
temp_val = temp_val + 10;
linspace_valid_val_mod1 = linspace_valid_val+[1 2 3]'; %%//'
logspace_valid_val_mod1 = logspace_valid_val+[1 20 300]'; %%//'

%%// **** Write back file data  ****

%%// Write back temperature data
A(temp_ind) = {[temperature_delim1,num2str(temp_val)]}

%%// Write back linspace data
mod_lin_val = cellfun(@strtrim,cellstr(num2str(linspace_valid_val_mod1)),'uni',0)
mod_lin_ind = cellstr(num2str(linspace_valid_ind))
sep_lin = repmat({linlog_delim1},numel(mod_lin_val),1)
A(lin_start_ind:lin_stop_ind)=cellfun(@horzcat,mod_lin_ind,sep_lin,mod_lin_val,'uni',0)

%%// Write back logspace data
mod_log_val = cellfun(@strtrim,cellstr(num2str(logspace_valid_val_mod1)),'uni',0)
mod_log_ind = cellstr(num2str(logspace_valid_ind))
sep_log = repmat({linlog_delim1},numel(mod_log_val),1)
A(log_start_ind:log_stop_ind)=cellfun(@horzcat,mod_log_ind,sep_log,mod_log_val,'uni',0)

%%// Remove leading whitespaces
A = strtrim(A)

%%// Write the modified data 
fid2 = fopen(file2,'w');
for row = 1:numel(A)
    fprintf(fid2,'%s\n',A{row,:});
end

fclose(fid);
fclose(fid2);

演示的更改:

  • 温度已添加 10
  • “Linspace”的元素中分别添加了 1 23
  • “Logspace”的元素中分别添加了 1 20300

结果

之前 -

Scan-42/01
Temperature [K] :-->   295.00
Time [s]        :-->     60

"Linspace"
0.01-->   0.96
0.02-->   0.95
0.103-->   0.95

"Logspace"
0.01-->   0.96
0.02-->   0.95
0.04-->   0.94

之后 -

Scan-42/01
Temperature [K] :-->   305
Time [s]        :-->     60

"Linspace"
0.01-->   1.96
0.02-->   2.95
0.103-->   3.95

"Logspace"
0.01-->   1.96
0.02-->   20.95
0.04-->   300.94

编辑1:

代码

%%// I-O filenames
input_filename = 'gistfile1.txt';
output_file = 'gistfile1_out.txt';

%%// Get data from input filename
delimiter = '\t';
formatSpec = '%s%s%[^\n\r]';
fid = fopen(input_filename,'r');
dataArray = textscan(fid, formatSpec, 'Delimiter', delimiter, 'ReturnOnError', false);

%%// Get data into A
A(:,1) = dataArray{1,1}
A(:,2) = dataArray{1,2}

%%// Find separator indices
ind1 = find([cellfun(@(x) isequal(x,''),A(:,2));1])
temperature_ind = find(~cellfun(@isempty,strfind(A,'Temperature')))
temperature_val = str2num(cell2mat(A(temperature_ind,2)))

%%// Linspace values
sep_linspace = cellfun(@(x) isequal(x,'"Linspace"'),A(:,1))
lin_start_ind = find(sep_linspace)+1
lin_stop_ind = ind1(find(ind1>lin_start_ind,1,'first'))-1

linspace_valid_ind = cellfun(@str2num,A(lin_start_ind:lin_stop_ind,1))
linspace_valid_val = cellfun(@str2num,A(lin_start_ind:lin_stop_ind,2))

%%// Logspace values
sep_logspace = cellfun(@(x) isequal(x,'"Logspace"'),A(:,1))
log_start_ind = find(sep_logspace)+1
log_stop_ind = ind1(find(ind1>log_start_ind,1,'first'))-1

logspace_valid_ind = cellfun(@str2num,A(log_start_ind:log_stop_ind,1))
logspace_valid_val = cellfun(@str2num,A(log_start_ind:log_stop_ind,2))

%%// ****  Let us modify some data ****
temp_val_mod1 = temperature_val + 10;
linspace_valid_val_mod1 = linspace_valid_val+[1:numel(linspace_valid_val)]';
logspace_valid_val_mod1 = logspace_valid_val+10.*[1:numel(logspace_valid_val)]';

%%// **** Write back file data into A  ****
A(temperature_ind,2) = cellstr(num2str(temp_val_mod1))
A(lin_start_ind:lin_stop_ind,2) = cellstr(num2str(linspace_valid_val_mod1))
A(log_start_ind:log_stop_ind,2) = cellstr(num2str(logspace_valid_val_mod1))

%%// Write the modified data 
fid2 = fopen(output_file,'w');
for row = 1:size(A,1)
    fprintf(fid2,'%s\t%s\n',A{row,1},A{row,2});
end

%%// Close files
fclose(fid);
fclose(fid2);

结果

之前 -

Scan-42/01
Temperature [K] :   295.00
Time [s]        :   60

"Linspace"
0.01    0.96
0.02    0.95
0.03    0.95

"Logspace"
0.01    0.96
0.02    0.95
0.04    0.94

之后 -

Scan-42/01  
Temperature [K] :   305
Time [s]        :   60
"Linspace"  
0.01    1.96
0.02    2.95
0.03    3.95
"Logspace"  
0.01    10.96
0.02    20.95
0.04    30.94

请注意,输入和输出文件之间唯一的格式差异是输出文件中的 "Linspace" 和上一行之间没有空白行,就像输入文件中一样。 “Logspace” 的情况与此类似。

关于arrays - 在 MATLAB 中将混合数据元胞数组保存到 ascii 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23170546/

相关文章:

c++ - 二进制文件问题

arrays - 如何在 bash 数组中的所有条目中用下划线替换空格

javascript - MongoDB选择_id数组的位置?

matlab - Mac OS X 上库的回滚兼容版本

matlab - 使用 matlab 在图像顶部生成热图

objective-c - 是否可以在 iOS 中 glob 一个目录并让操作系统缓存结果?

java - 如何将输入放入两个不同的数组中

java - 将文件读入数组返回错误的元素

matlab - 输入几个 varargin 参数

macos - 检查 Cocoa 中的两个文件是否相同