2015-01-27 2 views
-1

Я новичок в perl. У меня ниже текстового файла, и оттуда я хочу только один столбец Time, а следующие столбцы - значения. Как создать текстовый файл с выходом моего желания в perl.Прочитать конкретный столбец в perl

Time Value Time Value Time Value 
1 0.353366497 1 0.822193251 1 0.780866396 
2 0.168834182 2 0.865650713 2 0.42429447 
3 0.323540698 3 0.865984245 3 0.856875894 
4 0.721728497 4 0.634773162 4 0.563059042 
5 0.545131335 5 0.029808531 5 0.645993399 
6 0.143720835 6 0.949973296 6 0.14425803 
7 0.414601876 7 0.53421424 7 0.826148814 
8 0.194818367 8 0.942334356 8 0.837107013 
9 0.291448263 9 0.242588271 9 0.939609775 
10 0.500159997 10 0.428897293 10 0.41946448 

Я попытался ниже код:

use strict; 
use warnings; 
use IO::File; 
my $result; 
my @files = (q[1.txt],q[2.txt],q[3.txt]); 
my @fhs =(); 
foreach my $file (@files) { 
    my $fh = new IO::File $file, O_RDONLY; 
    push @fhs, $fh if defined $fh; 
} 

while(1) { 
    my @lines = map { $_->getline } @fhs; 
    last if grep { not defined $_ } @lines[0..(@fhs-1)]; 
    my @result=join(qq[\t], map { s/[\r?\n]+/ /g; $_ } @lines) . qq[\r\n]; 
    open (MYFILE, '>>Result.txt'); 
    print (MYFILE "@result"); 
    close (MYFILE); 
} 
+1

Я не вижу какой-либо код. Лучше всего обновить свой вопрос. Обычно вы должны предоставить оба входных данных. Ожидаемый результат. И, по крайней мере, попытка кода вызвать проблему. –

+0

Я могу скопировать три текстовых файла вместе. Теперь у меня есть 6 текстовых файлов, и оттуда я хочу показать только первые четыре столбца. Как мне это сделать? – James

+0

Снова трудно сказать, не видя свой код и не зная код, который у вас есть. Хотелось бы посмотреть на split() –

ответ

0

Прямо сейчас, вы просто конкатенации строк файлов вместе. Если это не даст вам нужный вам результат, вам нужно вырезать несколько столбцов.

Поскольку ваш вывод выглядит так, как вы вставляете файлы с разделителями табуляции в качестве ввода, я разбиваю строки, входящие в закладки. А поскольку вам нужен только второй столбец, я беру только столбец в первом смещении от раскола.

my $line_num = 0; 
while(1) { 
    my @lines = map { $_->getline } @fhs; 
    last if grep { not defined $_ } @lines[0..$#fhs]; 
    $line_num++; 
    my @rows  = map { [ split /\t/ ] } @lines; 
    my $time_val = $rows[0][0]; 
    die "Time values are not all equal on line #$line_num!" 
     if grep { $time_val != $_->[0] } @rows 
     ; 
    my $result = join(q[\t], $time_val, map { $_->[1] } @rows); 
    open (MYFILE, '>>Result.txt'); 
    print (MYFILE "$result\n"); 
    close (MYFILE); 
} 

Конечно, нет никаких причин, чтобы сделать заказ кодирования, чтобы разделить с разделителями столбцов:

use Text::CSV; 
... 
my $csv = Text::CSV->new({ sep_char => "\t" }); 

while(1) { 
    my @rows = map { $csv->getline($_) } @fhs; 
    last if grep { not defined $_ } @rows[0..$#fhs]; 
    my ($time_val, @time_vals) = map { $_->[0] } @rows; 
    my @values = map { $_->[1] } @rows; 
    die "Time values are not all equal on line #$line_num!" 
     if grep { $time_val != $_ } @time_vals 
     ; 
    my $result = join(q[\t], $time_val, @values); 
    ... 
} 
+0

Большое спасибо @Axeman – James

1

Я бы с split.

use warnings; 
use strict; 

open (my $f, '<', 'your-file.dat') or die; 

while (my $line = <$f>) { 
    my @elems = split ' ', $line; 
    print join "\t", @elems[0,1,3,5]; 
    print "\n"; 
} 
+0

Спасибо @ Рене Nyffenegger ... – James

+0

Если вы хотите отформатировать его в аккуратные столбцы так заголовки выравнивания с приведенными ниже данными, замените строки 2 'print' в цикле while на' printf ("% 4s% -15s% -15s% -15s \ n", @elems [0,1,3,5]); ' – Joshua

1

Это однострочный; нет необходимости писать сценарий:

$ perl -lanE '$,="\t"; say @F[0,1,3,5]' 1.txt 2.txt 3.txt 

Если вы хотите, вы можете сократить его:

$ perl -lanE '$,="\t"; say @F[0,1,3,5]' [123].txt 
+0

Спасибо @William Pursell – James

-1
use strict;  
use warnings;  
open(FH,"<","a.txt");  
print "=========== A File content =========== \n";  
my $a = `cat a.txt`; 
print "$a\n"; 

my @temp = <>; 

    my (@arr, @entries, @final); 
    foreach (@temp) { 
     @arr = split (" ", $_); 
     push @entries, @arr; 
} 
close FH; 

my @entries1 = @entries; 

for(my $i = 7; $i<=$#entries; $i=$i+2) { 

     push @final, $entries[$i]; 
} 

my $size = scalar @final; 

open FH1, ">", "b.txt"; 
print FH1 "Time \t Value\n"; 
for(my $i = 0; $i < $size; $i++) { 

     my $j = $i+1; 
     print FH1 "$j \t $final[$i]\n"; 
} 

close FH1;  

print "============ B file content ===============\n";  
my $b = `cat b.txt`;  
print "$b"; 


O/P:  
=========== A File content =========== 
Time Value Time Value Time Value  
1 0.353366497 1 0.822193251 1 0.780866396 
2 0.168834182 2 0.865650713 2 0.42429447 
3 0.323540698 3 0.865984245 3 0.856875894 
4 0.721728497 4 0.634773162 4 0.563059042 
5 0.545131335 5 0.029808531 5 0.645993399 
6 0.143720835 6 0.949973296 6 0.14425803 
7 0.414601876 7 0.53421424 7 0.826148814 
8 0.194818367 8 0.942334356 8 0.837107013 
9 0.291448263 9 0.242588271 9 0.939609775 
10 0.500159997 10 0.428897293 10 0.41946448 

============ B file content =============== 
Time  Value 
1  0.353366497 
2  0.822193251 
3  0.780866396 
4  0.168834182 
5  0.865650713 
6  0.42429447 
7  0.323540698 
8  0.865984245 
9  0.856875894 
10  0.721728497 
11  0.634773162 
12  0.563059042 
13  0.545131335 
14  0.029808531 
15  0.645993399 
16  0.143720835 
17  0.949973296 
18  0.14425803 
19  0.414601876 
20  0.53421424 
21  0.826148814 
22  0.194818367 
23  0.942334356 
24  0.837107013 
25  0.291448263 
26  0.242588271 
27  0.939609775 
28  0.500159997 
29  0.428897293 
30  0.41946448