2010-11-24 13 views
1

まで、特定の行からの読み込み開始し、それだけの行の最初の列を取得する:はPerlが、私は次のようなテキストファイルを持って最後

Line 1 
Line 2 
Line 3 
Line 4 
Line 5 
filename2.tif;Smpl/Pix & Bits/Smpl are missing. 

常に同じです5行がありますが、 6行目はデータの読み込みを開始する場所です。データを読み込むと、各行(6行目から始まる)はセミコロンで区切られます。私はちょうど各行の最初のエントリを取得する必要があります(6行目から)。例えば

:希望

Line 1 
Line 2 
Line 3 
Line 4 
Line 5 
filename2.tif;Smpl/Pix & Bits/Smpl are missing. 
filename4.tif;Smpl/Pix & Bits/Smpl are missing. 
filename6.tif;Smpl/Pix & Bits/Smpl are missing. 
filename8.tif;Smpl/Pix & Bits/Smpl are missing. 

出力は次のようになります。

filename2.tif 
filename4.tif 
filename6.tif 
filename8.tif 

が可能これは、もしそうなら、私はどこを開始していますか?

+1

それが可能です。まだコードはありますか? – aschepler

+0

はいといいえ。これはまだありませんが、これを実装しようとしているコードは300行以上あります。基本的には、すでに存在するテキストファイルからファイルを処理するために実装しようとしている新しい機能です。 – drewrockshard

+0

* "Perlで、私はできるのですか?" *は** "¡はい!"です**しかし、いくつかの答えは** "はい、でも..."と続きます。 ** – tchrist

答えて

4

これはPerlの自動split」を使用しています(または「awkの)モード:

perl -n -F'/;/' -a -e 'next if $. <= 5; print "$F[0]\n";' < data.file 

見る 'perlrun' と 'perlvar'。


あなたはファイルハンドルとスキップする行数を与えられている機能でこれを行う必要がある場合、あなたはPerlの自動split 'モードを使用できなくなります。

sub skip_N_lines_read_column_1 
{ 
    my($fh, $N) = @_; 
    my $i = 0; 
    my @files =(); 
    while (my $line = <$fh>) 
    { 
     next if $i++ < $N; 
     my($file) = split /;/, $line; 
     push @files, $file; 
    } 
    return @files; 
} 

これは、ループを初期化、ラインを分割し、最初の結果を捕捉、その後、それらの最初のNをスキップし、行を読み取ります。 my($file) = split...の行は微妙です。かっこは、分割がリスト・コンテキストを持つことを意味します。したがって、値のカウントではなく値のリストを生成し、最初の変数を変数に割り当てます。かっこが省略されている場合は、リスト演算子にスカラーコンテキストを提供するので、分割出力のフィールド数は$fileに割り当てられます。これは必要なものではありません。ファイル名が配列の末尾に追加され、配列が返されます。コードはファイルハンドルを開かなかったので、ファイルハンドルを閉じません。別のインタフェースは、ファイル名(オープンファイルハンドルではなく)を関数に渡します。関数内でファイルを開いたり閉じたりすると、エラー処理が心配です。その後、

そして、あなたがファイルを開くとヘルプが必要な場合など、:

use Carp; 

sub open_skip_read 
{ 
    my($name) = @_; 
    open my $fh, '<', $name or croak "Failed to open file $name ($!)"; 
    my @list = skip_N_lines_read_column_1($fh, 5); 
    close $fh or croak "Failed to close file $name ($!)"; 
    return @list; 
} 
+0

+1。最高の答え、本当に。 –

+0

これはスクリプトで、コマンドラインではなく、既に存在するファイルのオープンファイルハンドルから読み込むにはどうすればよいでしょうか? – drewrockshard

+0

@Jonathan:それは、perlが区切り文字の周りにスラッシュ区切り文字をあいまいにするのを知っていることを私には恐れています。私はそれがそれをしたことを知らなかった! – tchrist

2

醜いですが、ダミーラインを読み出して分割します。残りの人たちのために。

my $logfile = '/path/to/logfile.txt'; 

open(FILE, $logfile) || die "Couldn't open $logfile: $!\n"; 

for (my $i = 0 ; $i < 5 ; $i++) { 
    my $dummy = <FILE>; 
} 

while (<FILE>) { 
    my (@fields) = split /;/; 
    print $fields[0], "\n"; 
} 

close(FILE); 
+0

これは次のように書くことができます: 'my @dummy; @dummy [0..4] = ; map {($ a)= split /; /; $ a、 "\ n"} ; 'を出力します。 –

+0

ファイルから読み込みしようとしていて、コマンドラインから読み込もうとしたらどうなりますか?私は相対的な場所にあるファイルを持っています(例えば、私はlogfile.txtによってそれを呼び出すことができます)。私はそれを読んで問題を抱えています、これまでのところ、私のコードはwhileループを連続的に撮影しており、Ctrl + Cを押してください。 – drewrockshard

+1

@Diego:* Por desgracia、*スライス代入で 'readline'演算子にリストコンテキストを渡して入力を使い果たしたので動作しません。残りの線は捨てられた。 – tchrist

2
#!/usr/bin/env perl 
# 
# name_of_program - what the program does as brief one-liner 
# 
# Your Name <[email protected]_host.TLA> 
# Date program written/released 
################################################################# 

use 5.10.0; 

use utf8; 
use strict; 
use autodie; 
use warnings FATAL => "all"; 

# ⚠ change to agree with your input: ↓ 
use open ":std" => IN => ":encoding(ISO-8859-1)", 
        OUT => ":utf8"; 
# ⚠ change for your output: ↑ — *maybe*, but leaving as UTF-8 is sometimes better 

END {close STDOUT} 

our $VERSION = 1.0; 

$| = 1; 

if (@ARGV == 0 && -t STDIN) { 
    warn "reading stdin from keyboard for want of file args or pipe"; 
} 

while (<>) { 
    next if 1 .. 5; 
    my $initial_field = /^([^;]+)/ ? $1 : next; 
    # ╔═══════════════════════════╗ 
    # ☞ your processing goes here ☜ 
    # ╚═══════════════════════════╝ 
} continue { 
    close ARGV if eof; 
} 

__END__ 
+0

みんな、私はまだ失われている - ** Perl **の新機能。私はすでにすべてを含むファイルを持っています。スクリプトでファイルを開き、最初の5行をスキップして、5行目以降のすべての行の最初の列を出力するだけです。 – drewrockshard

+0

@drewsrockhard:それは私のプログラムがすることです。やってみて。 – tchrist

+0

これを実行する方法と "入力ファイル"を配置する場所の例を表示できますか? – drewrockshard

関連する問題