Kode Perl di bawah ini berfungsi untuk meng-injeksikan nilai header yang terdapat dalam file ASCII (.txt) ke dalam header SEGY.
dari header sebelum injeksi text.
Gambar di bawah ini menunjukkan 5 baris pertama dari header.txt (pada contoh ini saya memiliki 4 kolom). Juga, perintah text2segyhdr.pl dengan meng-injeksikan kolom pertama dari text file untuk byte 1, kolom 2 untuk byte 9, kolom 3 untuk byte 17, dan kolom 4 untuk byte 25. Perhatikan bagaimana saya menjalankan perintah Perl!
Gambar di bawah ini adalah dump setelah injeksi. Perhatikan byte 001, 009, 017, 025 sudah berubah.
Copy kode berikut lalu berinama text2segyhdr.pl, jalankan spt contoh saya di atas.
#!/usr/bin/perl
#SEGY READ
$fname=$ARGV[0];
my $num_args = $#ARGV -2;
print ">>>>> Read SEGY...<<<<< \n";
sysopen(IN,$fname,O_RDONLY) or die "Can't Open $fname: $!";
$size= -s IN;
sysread (IN,$binary,$size);
close(IN);
$noofsamples = unpack("n",substr($binary,3220,4));
$bytewidth=4; #32 bits
$tracecount=($size-3600)/(240+$bytewidth*$noofsamples);
$tracecount = sprintf("%.0f", $tracecount);
print ">>>>> Read TEXT HEADER... <<<<< \n";
#####ASCII TEXT HEADER READ
my $file = $ARGV[1];
my @data;
open( FILE, $file ) or die "Can't open file '$file': $!";
while( <FILE> ) {
chomp;
my @row = split;
push @data, \@row;
}
close( FILE );
###INSERT TEXT TO HEADER
for ($j=0; $j<=$num_args; $j++)
{
for ($i=0; $i<=$tracecount; $i++)
{$startbyte=3600+($i)*240+($i)*$bytewidth*$noofsamples+$ARGV[$j+2]-1;
sysopen(IN,$fname,2) or die "Can't sysopen $fname";
sysseek(IN,$startbyte,0);
$databin = pack 'N', "$data[$i][$j]";
syswrite(IN,$databin,4) or die "Can't write $fname";
close(IN);
print "\e[?25l";
printf ">>>>> Writing Progress...be patient... (%.0f%%)\r",$i/$tracecount*100 ;
}
}
print "\e[?25h";
print "\n";
print ">>>>> Done ! <<<<< \n";
No comments:
Post a Comment