Perl,在.txt文件中对数据进行排序

时间:2013-03-29 12:21:12

标签: database perl csv

我编写了一个为文件添加新值的程序。文本。现在我想编写选项,以便我可以对选定列上的文件中的数据进行排序,以及使用正则表达式搜索任何列中的数据的功能。怎么去呢?

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;
}

2 个答案:

答案 0 :(得分: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 :(得分:0)

好的,我用它来解决这个问题。 wyszukwaniem现在使用正则表达式在选定列之后处理文件。