您好, 我有一点问题。 我有一个超过200mb的txt文件。 看起来像是:
%Hello World
%秒句
%第三;
%实例
2014年2月12日
; - 400; -200; 200
; 123; 233; 434
%Hello World
%秒句
%第三
%实例
2014年2月12日
; - 410; 200; 20300
; 63; 23; 43
; 23; 44; 78213
...
......
我只需要分号后面的值,如:
值1 {1,1} = [ - 400];值{1,2} = [ - 200];和价值{1,3} = [200]
值2 {1,1} = [123];值{1,2} = [233];和价值{1,3} = [434]
等等。
向某人提出一个想法,如何在单元格数组或vektor中拆分值?
因此,变量必须是:
Var1 = [ - 400 -200 200;
434 233 434;
VAR2 = [ -410 200 20300;
63 23 43; 23 44 28213]
我将在另一个值的每个日期之后分开。例如,当我有55个日期时,我将有55个值。 shareeditundeleteflag
答案 0 :(得分:0)
蛮力方法是打开你的文件,然后一次读取每一行。对于每一行,您检查第一个字符是否为分号,如果是,则将该字符串从该行的第二个字符中的;
分隔符拆分,直到结束。您将收到一个字符串的单元格数组,因此您必须将其转换为数字数组。因为您可能每行都包含不同数量的数字,所以让我们将每个数组存储到一个单元格数组中,此单元格数组中的每个元素都将包含每行数字。因此,做这样的事情。我们假设您的文本文件存储在text.txt
:
fid = fopen('text.txt');
if fid == -1
error('Cannot find file');
end
nums = {};
while true
st = fgetl(fid);
if st == -1
break;
end
if st(1) == ';'
st_split = strsplit(st(2:end), ';');
arr = cellfun(@str2num, st_split);
nums = [nums arr];
end
end
让我们慢慢浏览上面的代码。我们首先使用fopen
打开文件进行阅读。我们检查从fopen
返回的ID是否为-1,如果是这种情况,我们找不到或打开文件,因此吐出错误。接下来,我们声明一个名为nums
的空单元格数组,它将存储解析文本文件时得到的数字。
现在,在我们到达文件末尾之前,从文件顶部开始获取一行文本,然后我们继续结束。我们使用fgetl
来实现此目的。如果我们读取-1,这意味着我们已到达文件的末尾,因此退出循环。否则,我们检查第一个字符是否为;
。如果是,那么我们查看第二个字符直到该行的结尾,并根据;
字符和strsplit
分割字符串。结果将是一个字符串数组,其中每个元素都是数字的字符串表示形式。您需要将此单元格数组转换回数字数组,因此您需要执行的操作是将str2num
应用于此单元格中的每个元素。您可以使用循环遍历每个单元格,也可以方便地使用[cellfun
](http://www.mathworks.com/help/matlab/ref/cellfun.html来允许您遍历此单元格中的每个元素并将字符串表示转换为数值。cellfun
的结果输出将为您提供由该行的;
字符分隔的每个值的数值数组表示。然后,我们将此数组放入存储在nums
中的单个单元格中。
整个代码的最终结果将为您提供基于您在nums
中存储的内容的数字数组。
如果我们遇到以;
开头的行,我假设您的文字文件仅的数字由;
个字符分隔。如果不是这样,那么我的代码将无效。我假设情况并非如此!
答案 1 :(得分:0)
这可能是假设统一结构化数据(每行3个有效数字)的一种方法 -
%// Read in entire text data into a cell array
data = importdata('sample.txt','');
%// Remove empty lines
data = data(~cellfun('isempty',data))
%// Find boundaries based on delimiter "%example"
exmp_delim_matches = arrayfun(@(n) strcmp(data{n},'%example'),1:numel(data))
bound_idx = [find(exmp_delim_matches) numel(exmp_delim_matches)]
%// Find lines that start with delimiter ";"
matches_idx = find(arrayfun(@(n) strcmp(data{n}(1),';'),1:numel(data)))
%// Select lines that start with character ";" and split lines based on it
%// Split selected lines based on the delimiter ";"
split_data = regexp(data(matches_idx),';','split')
%// Collect all cells data into a 1D cell array
all_data = [split_data{:}]
%// Select only non-empty cells and convert them to a numeric array.
%// Finally reshape into a format with 3 numbers per row as final output
out = reshape(str2double(all_data(~cellfun('isempty',all_data))),3,[]).' %//'
%// Separate out lines based on the earlier set bounds
out_sep = arrayfun(@(n) out(matches_idx>bound_idx(n) & ...
matches_idx<bound_idx(n+1),:),1:numel(bound_idx)-1,'Uni',0)
%// Display results for verification
celldisp(out_sep)
代码运行 -
out_sep{1} =
-400 -200 200
123 233 434
out_sep{2} =
-410 200 20300
63 23 43
23 44 78213