2013-03-29 95 views
0

我編寫了一個程序,爲該文件添加新值。文本。現在我想編寫選項,以便我可以對選定列上的文件中的數據進行排序,並且可以使用正則表達式搜索任何列中的數據。如何去做呢?Perl,對.txt文件中的數據進行排序

sub show_database 
{ 
    $file = 'baza.txt'; 
    print "Database \n"; 
    open(my $data, '<', $file) or die "Could not open '$file' $!\n"; 

    while (my $line = <$data>) 
    { 
     chomp $line; 
     my @fields = join(" ", split(';', $line)); 
     print @fields; 
     print " "; 
     print "\n"; 

    } 
} 
sub insert{ 

    print "\n \nInset new data: Name;Surname;Year \n"; 

    open(PLIK,'baza.txt'); 
    while(<PLIK>) 
    { 
     $linia = $_; 
    } 
    $ostatnia = $linia; 
    @tablica = $ostatnia; 
    @tab = split(/;/,$ostatnia); 

    $poprzedni = $tab[0]; 
    $poprzedni++; 

    close PLIK; 

    $dane = <STDIN>; 
    open(BAZA, '>>baza.txt'); 
    print BAZA $poprzedni; 
    print BAZA ";"; 
    print BAZA $dane; 


    close BAZA; 
} 
sub menu{ 

    print "\n \n \n \n"; 
    print "1 - Read database \n"; 
    print "2 - Insert new row \n"; 
    print "0 - EXIT \n \n"; 
    $opcja = <STDIN>; 
} 
system("clear"); 
menu(); 
if($opcja == 1) 
{ 
    show_database(); 
} 
if($opcja == 2) 
{ 
    insert(); 
    menu(); 
} 
if($opcja == 0) 
{ 
    exit; 
} 

回答

1

我會建議使用Tie::File

#!/usr/bin/perl 
use strict; 
use warnings; 

use Tie::File; 

tie my @file, Tie::File, "/path/to/some/file.txt" or die $!; 

@file = sort by_column1 @file; 
print join("\n", @file) . "\n"; 

untie @file; 

sub by_column1 { 
    (split(";", $a))[1] <=> (split(";", $b))[1] 
} 

另一種選擇是使用DBD::CSV

+1

如果行綁定我的@file,「/path/to/some/file.txt」或者死掉$ !;'不讀'綁我的@file,Tie :: File,「/ path/to/some /file.txt「或者死掉$ !;'? –

0

好的,我與它一起工作。 wyszukwaniem現在使用正則表達式在所選列之後處理文件。

相關問題