如何从文本文件中提取数据?

如何从文本文件中提取数据?

文本文件如下:

  1. 分隔符:空格
  2. 表格:3,496,080(行)x 6(列)
  3. A 栏:年份
  4. B 列:一年中的某一天
  5. C 栏:小时
  6. D 列:30、32.5、35、37.5、40 或 45 值之一
    • E 列的值从 25 开始到 45 结束,每五行连续增加 5。
  7. E 列:25、30、35、40 或 45 值之一
    • D 列的值从 30 开始到 45 结束,在接下来的 499,440 行之后连续增加 2.5。
  8. F 列:值

    • A、B 和 C 列在 499,440 行之后重新开始。
         1st row: 1998 152 1   30  25 12.5
   499,441st row: 1998 152 1  32.5 25 11.6
1998 152 1 30 25 12.5
1998 152 1 30 30 12
1998 152 1 30 35 11.8
1998 152 1 30 40 11.9
1998 152 1 30 45 12
1998 152 3 30 25 10.9
1998 152 3 30 30 10.7
1998 152 3 30 35 10.6
1998 152 3 30 40 10.5
1998 152 3 30 45 10.4
1998 152 5 30 25 9.6
1998 152 5 30 30 9.5
1998 152 5 30 35 9.2
1998 152 5 30 40 9
1998 152 5 30 45 8.7
1998 152 7 30 25 8.4
1998 152 7 30 30 8.5
1998 152 7 30 35 8.9
1998 152 7 30 40 9.6
1998 152 7 30 45 10.7
1998 152 9 30 25 13.2
1998 152 9 30 30 14.3
1998 152 9 30 35 15.2
1998 152 9 30 40 15.9
1998 152 9 30 45 16.2
1998 152 11 30 25 16.2
1998 152 11 30 30 16.5
1998 152 11 30 35 16.8
1998 152 11 30 40 17.2
1998 152 11 30 45 17.9
1998 152 13 30 25 18
1998 152 13 30 30 18.6
1998 152 13 30 35 19.3
1998 152 13 30 40 20.1
1998 152 13 30 45 21.2
1998 152 15 30 25 20.4
1998 152 15 30 30 21.4
1998 152 15 30 35 22.5
1998 152 15 30 40 23.7
1998 152 15 30 45 25
1998 152 17 30 25 21.8
1998 152 17 30 30 23.2
1998 152 17 30 35 24.7
1998 152 17 30 40 26
1998 152 17 30 45 26.9
1998 152 19 30 25 22.4
1998 152 19 30 30 23.4
1998 152 19 30 35 24.3
1998 152 19 30 40 25
1998 152 19 30 45 25.6
1998 152 21 30 25 25.1
1998 152 21 30 30 25
1998 152 21 30 35 24.3
1998 152 21 30 40 23.3
1998 152 21 30 45 22
1998 152 23 30 25 20.9
1998 152 23 30 30 19
1998 152 23 30 35 17.2
1998 152 23 30 40 15.7
1998 152 23 30 45 14.5

我想提取所有行,然后将数据写入文本文件,即 D=30 和 E=25 和 B>=152 和 B<=241。

fid=fopen('table.txt','r');
formats='%f';
RawData=fscanf(fid,formats);

fclose(fid);

L=length(RawData);

fileID=fopen('test.txt','w');

我尝试过

我尝试使用 Matlab,使用下面的代码,但是速度非常慢:

for i=1:L/6

    data(i,:)=RawData((i-1)*6+1:(i-1)*6+6)';


    if data(i,4)==30
        if data(i,5)==25
            if data(i,2)>=152 && data(i,2)<=241
                    fprintf(fileID,'%d %d %d %d %d %3.1f \n',data(i,:));
             end
          end
     end


end

答案1

我想提取所有行,然后将数据写入文本文件,即 D=30 和 E=25 和 B>=152 和 B<=241。

在 Awk 中这应该很简单

awk '$4==30 && $5==25 && $2>151 && $2<242' file > newfile

默认的输入和输出字段分隔符是空格。

答案2

评论:如果你正在编写嵌套的“if”语句,那么你肯定做错了。因此,即使在 MATLAB 中,它总是比系统调用慢,一旦你将这些数据加载到一个大数组中,就可以执行以下操作

my_output = data(data(:,2)>=152 & data(:,2)<=241 &data(:,4)==30 & data(:,5)==25,:)

并将其变成table()并写入到您的输出中。

答案3

您可以使用文本QL库来编写 SQL 查询以便从文本文件中提取数据。

您可以使用以下命令进行安装(我相信它仅在 18.04 版本中可用,否则您需要以其他方式、docker 或从源代码进行安装):

sudo apt install textql

在你的情况下,命令将是:

textql -sql "select * where c3=30 and c4=25 and c1>=152 and c1<=241" \
 -dlm='0x20' \
 -output-dlm='0x20' \
 <file-name>

解释:

  • -sql "select * where c3=30 and c4=25 and c1>=152 and c1<=241"

    常规 SQL 查询from被省略,因为在本例中不需要它。由于您的文件没有列标题,因此列的默认名称为c0第一列、c1第二列、c2第三列等。

  • -dlm='0x20'

    此参数用于告诉命令分隔符是空格,而不是默认的逗号,。并且20 16是空格的十六进制代码特点。

  • output-dlm='0x20'

    此参数是告诉命令在输出中使用空格字符作为分隔符,而不是默认的逗号,

  • <file-name>

    必须将其更改为使用实际文件名的路径。

相关内容