将一组文本文件导入到一组列中

将一组文本文件导入到一组列中

我有一组名为outfile00.txtuntil的文本文件outfile297.txt。每个文件的每一行都有一个数字(十进制或其他),第一行除外(类似于标题)。

我需要将每个文件的内容导入到从 A 列(将对应outfile00.txt)开始的列中,直到所有文本文件都被导入。

以下是 的开头示例outfile00.txt

KP=0.50 ,Ki=0.10 ,Kd=0.05
0.00
0.00
0.00
0.00

实际文件约有 1500 行。我尝试使用“数据”选项卡手动导入文本文件;Excel 没有问题,文本已导入。

如何批量导入所有文本文件?

编辑

我相信我没有清楚地定义我的问题,所以这里有一些额外的细节。

关于cybernard 的方法,

如果我创建一个制表符分隔值文件(制表符位于每行的字母和数字之间),如下所示,

a   1
b   2
c   3
e   4
f   5
g   6

我可以直接导入文本文件并得到以下内容,

导入的制表符分隔值文件

我希望创建一个类似于上述 TSV 文件的文件。示例如下,

KP=0.50 ,Ki=0.10 ,Kd=0.05   KP=0.50 ,Ki=0.10 ,Kd=0.10   KP=0.50 ,Ki=0.10 ,Kd=0.15
0.00    117.00  123.00
0.00    118.00  124.00
0.00    119.00  125.00
0.00    120.00  126.00

产生以下导入结果,

从生成的 TSV 文件导入结果

我需要知道如何从我的源文件生成这样的 TSV 文件。

答案1

您可以使用 Power Query 合并文件夹中的所有文件。Power Query 是 Microsoft 为 Excel 2010 和 2013 提供的免费插件,并作为“获取和转换”内置于 Excel 2016 中。

Ken Puls 有详细的教程这里

一旦设置了查询,就可以在文件夹中添加或删除文件,并且只需单击按钮即可刷新查询。

答案2

第一个 00 必须重命名为 0。您可能必须删除其他 0 偏移。例如 01,02,03 不起作用,重命名为 1,2,3。

从命令提示符进入包含所有文件的文件夹。

FOR /L %i IN (0,1,297) DO 类型 outfile%i.txt >>master.txt

这会将您的所有文件合并到master.txt中。

因此,您需要在文件之间使用 Tab 键。在记事本中,创建一个名为 tab.txt 的文件,其中包含一个标签,保存后确保其大小为 1 个字节,并且您没有意外输入其他字符。

FOR /L %i IN (0,1,297) DO 类型 outfile%i.txt tab.txt>>master.txt

答案3

问:我需要知道如何从我的源文件生成这样的 TSV 文件。

你知道吗命令就为了这个?

paste outfile*.txt > out.txt

如果您想编写自己的算法,请选择您喜欢的(脚本)语言。

  1. awkawk -f awk.awk outfile*.txt > out.txt

    BEGIN {count = 1}
    FNR == 1 && FNR < NR {count++}
    
    {
      if ( _[FNR] ) {
        while ( c[FNR] != count-1 ) {
          _[FNR] = (_[FNR] " " sprintf("%8s",""))
          c[FNR]++
        }
        _[FNR] = (_[FNR] "\t" sprintf("%-8s",$0))
        c[FNR]++
      }
      else if ( count == 1 ) {
        _[FNR] = sprintf("%-8s",$0)
        c[FNR]++
      }
      else {
        while ( c[FNR] != count-1 ) {
          if ( _[FNR] )
            _[FNR] = (_[FNR] " " sprintf("%8s",""))
          else
            _[FNR] = sprintf("%8s","")
          c[FNR]++
        }
        _[FNR] = (_[FNR] "\t" sprintf("%-8s",$0))
        c[FNR]++
      }
    }
    
    END {
      for (i=1; i<=length(_); i++)
        print _[i]
    }
    
  2. perlperl perl.pl > out.txt

    use strict;
    use warnings;
    
    my $i;
    my @rows;
    my @files = map { "outfile$_.txt" } 0 .. 297;
    
    foreach my $file (@files) {
        open my $infh, '<', $file or die $!;
        $i=0;
        while (<$infh>) {
            chomp;
            my $data = $_;
            if (length $rows[$i]) {
                $rows[$i++] .= "\t" . $data;
            } else {
                $rows[$i++] = $data;
            }
        }
    }
    
    foreach my $row (@rows) {
        print "$row\n";
    }
    

附言如果您想知道,bash、awk 和 perl 可在多个平台上使用,包括 Windows(赛格威这是我对此的推荐)。

更新:paste outfile*.txt > out.txt这是我使用的输入文件,以及适用于 Windows 的 Git

==> outfile00.txt <==
KP=0.50 ,Ki=0.10 ,Kd=0.05
0.00
0.00
0.00
0.00

==> outfile01.txt <==
KP=1.50 ,Ki=1.10 ,Kd=1.05
1.00
1.00
1.00
1.00

==> out.txt <==
KP=0.50 ,Ki=0.10 ,Kd=0.05       KP=1.50 ,Ki=1.10 ,Kd=1.05
0.00    1.00
0.00    1.00
0.00    1.00
0.00    1.00

相关内容