【发布时间】:2016-04-14 16:00:50
【问题描述】:
我一直在阅读一个相对较大的文本文件,其中包括散布在其他文本中的数字列,但实际上我只想要数字列。还有一堆其他的文本没有在这里显示,它们不是定期显示的。
文件格式:
*** LOTS OF OTHER TEXT AND NUMBERS ***
iter continuity x-velocity y-velocity k epsilon vf-vapour_ph time/iter
111 3.4714e-08 5.3037e-10 6.0478e-10 1.6219e-15 1.8439e-13 0.0000e+00 0:00:01 14
112 3.2652e-08 5.0553e-10 5.6497e-10 1.3961e-15 1.5730e-13 0.0000e+00 0:00:01 13
113 3.1371e-08 4.6175e-10 5.0506e-10 1.2020e-15 1.3419e-13 0.0000e+00 0:00:01 12
114 3.0016e-08 4.4331e-10 4.7391e-10 1.0388e-15 1.1447e-13 0.0000e+00 0:00:01 11
115 2.8702e-08 4.2111e-10 4.4778e-10 8.9904e-16 9.7680e-14 0.0000e+00 0:00:01 10
116 2.7476e-08 4.1484e-10 4.2711e-10 7.7955e-16 8.3342e-14 0.0000e+00 0:00:01 9
117 2.6436e-08 3.9556e-10 4.0601e-10 6.7890e-16 7.1113e-14 0.0000e+00 0:00:01 8
118 2.5374e-08 3.8633e-10 3.8826e-10 5.9234e-16 6.0674e-14 0.0000e+00 0:00:00 7
119 2.4292e-08 3.7473e-10 3.7584e-10 5.1814e-16 5.1786e-14 0.0000e+00 0:00:00 6
120 2.3474e-08 3.5952e-10 3.5622e-10 4.5405e-16 4.4207e-14 0.0000e+00 0:00:00 5
121 2.2612e-08 3.4485e-10 3.4159e-10 3.9910e-16 3.7707e-14 0.0000e+00 0:00:00 4
iter continuity x-velocity y-velocity k epsilon vf-vapour_ph time/iter
122 2.1992e-08 3.4100e-10 3.2964e-10 3.5272e-16 3.2204e-14 0.0000e+00 0:00:00 3
123 2.1592e-08 3.2444e-10 3.0170e-10 3.1487e-16 2.7500e-14 0.0000e+00 0:00:00 2
124 2.1053e-08 3.3145e-10 2.9325e-10 2.8009e-16 2.3485e-14 0.0000e+00 0:00:00 1
125 2.0390e-08 3.1502e-10 2.7534e-10 2.5433e-16 2.0053e-14 0.0000e+00 0:00:00 0
step flow-time mfr_arm_inne mfr_arm_oute pressure_sta pressure_sta pressure_tot pressure_tot velocity_max velocity_min
1 5.0000e-07 -5.5662e-08 1.4217e-07 6.0015e+00 5.9998e+00 6.0015e+00 5.9998e+00 2.8934e-04 3.3491e-10
Flow time = 5e-07s, time step = 1
799 more time steps
Updating solution at time levels N and N-1.
done.
Writing data to output file.
Current time=0.000000 Position=-0.00000036409265555078 Velocity=0.000015 Net force=0.210322
Fluid force=-0.477050N, Stator force=0.200000N ,Spring force=-32.990534N ,Top force=0.000000N, Bottom force=33.007906N, External force=0.470000N
Next time=0.000001 Position=-0.00000036400170391852 Velocity=0.000182
Applying motion to dynamic zone.
*** CONTINUING TEXT AND NUMBERS ***
我想要的行是:
111 3.4714e-08 5.3037e-10 6.0478e-10 1.6219e-15 1.8439e-13 0.0000e+00 0:00:01 14
112 3.2652e-08 5.0553e-10 5.6497e-10 1.3961e-15 1.5730e-13 0.0000e+00 0:00:01 13
到目前为止,我的脚本可以运行,但完成整个过程大约需要 80 年代。
我想,我的一些文件中的时间冒号会让我更加尴尬。有些文件会有或多或少的列包含不同类型的数据,有些会在主块的末尾有额外的设置,例如:
step flow-time mfr_arm_inne mfr_arm_oute pressure_sta pressure_sta pressure_tot pressure_tot velocity_max velocity_min
1 5.0000e-07 -5.5662e-08 1.4217e-07 6.0015e+00 5.9998e+00 6.0015e+00 5.9998e+00 2.8934e-04 3.3491e-10
我不想获取这些数据,但它可以具有与我想要的行非常相似(有时相同)的格式。
它的主要目的是读取每一行,看看行前的几个字符(基于迭代号的长度)是否与我期望的匹配(从 1、2、3.. 开始) .n)。我这样做的原因是尝试删除我不想要的“步骤...”下的行。但是,该文件大约有 180,000 行长(这是我最短的),因此您可以想象这会有点慢。
% read the raw data from the file
file = 'file.txt';
fid = fopen(file, 'r');
raw = textscan(fid, '%s', 'Delimiter', '\n');
fid = fclose(fid);
raw = raw{1,1};
% expression used for splitting the columns up
colExpr = '[\d\.e:\-\+]+';
% beginning number
iterNum = 1;
% loop through lines
for line = 1:length(raw);
% convert to string for comparison
iterStr = num2str(iterNum);
thisLine = raw{line, 1};
% if the right length and the right string,
if length(iterStr) <= length(thisLine) && ...
strcmp(thisLine(1:length(iterStr)), iterStr)
% split the string
result(iterNum,:) = regexp(thisLine,colExpr, 'match');
iterNum = iterNum + 1;
end
end
% convert to matrix
residuals = cellfun(@str2num, result);
使用分析器,我意识到 num2str() 函数是最慢的部分(20 秒),其次是 int2str()(10 秒),但我看不到在没有它的情况下读取数据的方法循环。
想知道我是否缺少一些东西来尝试优化这个过程?
编辑:
我已经包含了更多我不想要的行以及一种可能的不同格式来尝试帮助答案。
【问题讨论】:
-
你能告诉我们一些“其他文本和数字”是什么样的吗?至少要忽略的文本行数是否一致?
-
没有一个是特别一致的,这就是为什么我选择寻找我想要的,而不是忽略我没有的,所以我不确定它是否有帮助?跨度>
-
您还可以在将文件加载到 MATLAB 之前对文件进行预处理以删除仅保留数字的文本行(诸如 grep、sed 或 awk 之类的东西可以轻松做到这一点)。然后,您将使用一行代码
load -ascii file.txt非常快速地将文件导入 MATLAB