![将一组文本文件导入到一组列中](https://linux22.com/image/1502373/%E5%B0%86%E4%B8%80%E7%BB%84%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E5%AF%BC%E5%85%A5%E5%88%B0%E4%B8%80%E7%BB%84%E5%88%97%E4%B8%AD.png)
我有一组名为outfile00.txt
until的文本文件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 文件。
答案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
如果您想编写自己的算法,请选择您喜欢的(脚本)语言。
awk
:awk -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] }
perl
:perl 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