将多个行中具有一定行数的一列数据从多个文本文件中提取到一个文本文件中

我有数百个文本文件。我想提取具有设置的行数的特定列。文件完全相同,唯一不同的是数据值。我想将该数据放入一个新的文本文件中,每个新列都位于前一个之前。

该文件是一个与.txt文件基本相同的.sed文件。这就是它的样子。该文件实际上来自Wvl 350-2150。

Comment: 
Version: 2.2
File Name: C:\Users\HyLab\Desktop\Curtis 
bernard\PSR+3500_1596061\PSR+3500_1596061\2019_Feb_16\Contact_00186.sed
<Metadata>
Collected By: 
Sample Name: 
Location: 
Description: 
Environment: 
</Metadata>
Instrument: PSR+3500_sn1596061 [3]
Detectors: 512,256,256
Measurement: REFLECTANCE
Date: 02/16/2019,02/16/2019
Time: 13:07:52.66,13:29:17.00
Temperature (C): 31.29,8.68,-5.71,31.53,8.74,-5.64
Battery Voltage: 7.56,7.20
Averages: 10,10
Integration: 2,2,10,8,2
Dark Mode: AUTO,AUTO
Foreoptic: PROBE  {DN},PROBE  {DN}
Radiometric Calibration: DN
Units: None
Wavelength Range: 350,2500
Latitude: n/a
Longitude: n/a
Altitude: n/a
GPS Time: n/a
Satellites: n/a
Calibrated Reference Correction File: none
Channels: 2151
Columns [5]:
Data:
Chan.#  Wvl Norm. DN (Ref.) Norm. DN (Target)   Reflect. %
0    350.0   1.173460E+002   1.509889E+001      13.7935
1    351.0   1.202493E+002   1.529762E+001      13.6399
2    352.0   1.232869E+002   1.547818E+001      13.4636
3    353.0   1.264006E+002   1.563467E+001      13.2665
4    354.0   1.294906E+002   1.578425E+001      13.0723

我上过一些编码课,但是那是很久以前的事了。我认为即使对于新手程序员来说,这也是一个非常简单的问题,虽然我不是,但我似乎找不到任何类似的东西,因此希望在这里寻求帮助。

老实说,我不需要任何花哨的东西,因为这样的东西太神奇了,所以我不必复制和粘贴每个文件!

12.3  11.3  etc...
12.3  11.3  etc...
12.3  11.3  etc...
etc.. etc.. etc...
ccqhjjf 回答:将多个行中具有一定行数的一列数据从多个文本文件中提取到一个文本文件中

在MATLAB R2016b或更高版本中,最简单的方法是使用readtable

t = readtable('file.sed',delimitedTextImportOptions( ...
    'NumVariables',5,'DataLines',36,...
    'Delimiter',' ','ConsecutiveDelimitersRule','join'));

其中

  • file.sed是文件名
  • 'NumVariables',5表示有5列数据
  • 'DataLines',36表示数据从第36行开始,一直持续到文件末尾
  • 'Delimiter',' '表示分隔各列的字符是一个空格
  • 'ConsecutiveDelimitersRule','join'意味着将多个空间当作一个空间对待(而不是像它们将数据的空列分开一样)。

这假设您发布的示例文件的格式与实际数据完全相同。如果不同,则可能必须修改以上参数,可能参考delimitedTextImportOptions的帮助,或者作为替代,fixedWidthImportOptions

现在您有了一个包含五列的MATLAB表t,其中第二列是波长,第五列是反射率-我想这就是您想要的?您可以使用

访问该列
t(:,5)

因此,要将所有反射率列收集到一个表中,您将执行以下操作

fileList = something % get the list of files from somewhere - say as a string array or a cell array of char
resultTable = table;
for ii = 1:numel(fileList)
    sedFile = fileList{ii};
    t = readtable(sedFile,delimitedTextImportOptions( ...
        'NumVariables',...
        'Delimiter','join'));
    t.Properties.VariableNames{5} = sprintf('Reflectance%d',ii);  
    resultTable = [resultTable,t(:,5)];
end

存在t.Properties.VariableNames ...行是因为t的第5列每次都会被调用Var5,但是在结果表中,每个变量名都必须是唯一的。在这里,我们将重命名输出表变量Reflectance1Reflectance2等,但是您可以将其更改为所需的任何内容-也许是sedFile中实际文件的名称-只要它是有效的唯一变量名称。

最后,您可以使用writetable将结果表保存到文本文件中。有关如何使用它的信息,请参见MATLAB帮助。

,

在具有numpy的Python 3.x中:

import numpy as np
file_list = something # filenames in a Python list
result_array = None
for sed_file in file_list:
    reflectance_column = np.genfromtxt(sed_file,skip_header=35,usecols=4)
    result_array = (reflectance_column if result_array is None else 
                    np.column_stack((result_array,reflectance_column)))
np.savetxt('outputfile.txt',result_array)

这里

  • skip_header=35忽略了前35行
  • usecols=4仅返回第5列(Python使用基于零的索引)
  • 有关更多详细信息,请参见help for savetxt
本文链接:https://www.f2er.com/3163138.html

大家都在问