本を読む

読書やコンピュータなどに関するメモ

どう書く?org:続・ファイル内の重複行削除

 これは手抜きしてPerl+SQLite3で。

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

my $dbfile = '/tmp/fileuniq.sqlite3';
my $table = 'fileuniq';

unlink $dbfile if (-e $dbfile);
my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile",
                       undef, undef, { AutoCommit => 0 } )
                or die $DBI::errstr;

$dbh->do("CREATE TABLE $table (lineno integer, line TEXT)");

open my $fh, '<', $ARGV[0] or die 'File not found';
my $count = 0;
while(<$fh>){
    my $sth = $dbh->prepare("DELETE FROM $table WHERE line = ?");
    $sth->execute($_);
    $sth->finish;

    $sth = $dbh->prepare("INSERT INTO $table VALUES (?, ?)");
    $sth->execute($count++, $_);
    $sth->finish;
}
close $fh;
$dbh->commit;

my $sth = $dbh->prepare("SELECT line FROM $table ORDER BY lineno");
$sth->execute;
while(my @row = $sth->fetchrow_array) {
    print $row[0];
}
$sth->finish;

$dbh->disconnect;
unlink $dbfile;

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://emasaka.blog65.fc2.com/tb.php/306-e9dea7fd

 | HOME | 

Categories

Recent Entries

Recent Comments

Recent Trackbacks

Appendix

emasaka

emasaka

フリーター。
連絡先はこのへん

Monthly


FC2Ad