有一个很大的文本源数据,无法直接导入matlab中,我用vim打开数据的情况如图,
我要读取中间那些比较长的闪电定位结果的行,一共有5万多行,在matlab里我应该怎么编写程序?
% 1. 打开文本文件;
% 2. 按行读入文本数据;
% 3. 排除没有等号(=)的行;
% 4. 在有等号的行中按空格和等号分离数据;
% 5. 取出有用数据;
% 6. 循环到文件末尾,关闭文件。
% 取出数据:纬度 经度 强度 陡度 误差
fn = 'flash_locate2006_08_25_18_20_19.txt'; % 注意文件路径fid = fopen(fn,'r');
data = [];
idx = 1;
while ~feof(fid)
tl = fgetl(fid);
id = findstr(tl,'=');
if ~isempty(id)
temp = {};
id = 1;
remain = tl;
while true
[str, remain] = strtok(remain, ' =');
if isempty(str), break; end
temp{id} = str;
id = id+1;
end;
use = 5:2:13;
tp = [];
for k = use
tp = [tp str2num(temp{k})];
end;
data(idx,:) = tp;
idx = idx+1;
end;
end;
追问
第五个语句while后面的那个波浪形符号是怎么打出来的?怎么我放进去就成了上标的了··然后运行的时候说下标分配尺寸不匹配
追答% 键盘左上角 Shift + ~
追问这个我知道,可是我输进去的是上标的形式,对程序的执行有影响吗?
追答% 直接从上面选中拷贝就行了
追问粘贴后也是上标,中英文切换都是上标
追答fn = 'flash_locate2006_08_25_18_20_19.txt'; % 注意文件路径fid = fopen(fn,'r');
data = [];
idx = 1;
tl = 'start';
%while ~feof(fid)
while length(tl)>1 % 换种方式,文件结束时,tl = -1
tl = fgetl(fid);
id = findstr(tl,'=');
if ~isempty(id)
temp = {};
id = 1;
remain = tl;
while true
[str, remain] = strtok(remain, ' =');
if isempty(str), break; end
temp{id} = str;
id = id+1;
end;
use = 5:2:13;
tp = [];
for k = use
tp = [tp str2num(temp{k})];
end;
data(idx,:) = tp;
idx = idx+1;
end;
end;
fclose(fid); % 忘了关闭文件,补上追问
提示错误 Subscripted assignment dimension mismatch.
然后只读出295个数据,整个文件的闪电数据是好几万个的
% 能否把文件按附件传上来
追问http://pan.baidu.com/s/1gdvHO6B
文件比较大,2G多,还要求不可外传,我截取的其中百分之一的量,放在网盘里了
% 文本数据中,部分陡度数据错误,含有“$”符号
% 可在分离数据时排除 [str, remain] = strtok(remain, ' =$');
fn = '闪电数据.txt'; % 注意文件名和路径fid = fopen(fn,'r');
data = [];
idx = 1;
tl = 'start';
%while ~feof(fid)
while length(tl)>1 % 换种方式,文件结束时,tl = -1
tl = fgetl(fid);
id = findstr(tl,'=');
if ~isempty(id)
temp = {};
id = 1;
remain = tl;
while true
[str, remain] = strtok(remain, ' =$'); % 添加了分离符号 $
if isempty(str), break; end
temp{id} = str;
id = id+1;
end;
use = 5:2:13;
tp = [];
for k = use
tp = [tp str2num(temp{k})];
end;
data(idx,:) = tp;
idx = idx+1;
end;
end;
fclose(fid);
温馨提示:答案为网友推荐,仅供参考