3

ファイルを別のファイルに分割する必要があります。

例 (元のファイル):

*****3123123*****RAW
text1
text2
*****2312354***RAW
text3

望ましい出力:

[ファイル1.txt]

*****3123123*****RAW    
text1
text2

[ファイル2.txt]

*****312312354***RAW
text3

分割を使用しようとしましたが、常に余分な白い文字が配列に取り込まれます

open FILE, "<file";
@file= <FILE>;
close FILE;
@lines = split (/(RAW\n)/, "@file");
foreach $value (@lines) {
  if ($value =~ /[a-z]|[A-Z]|[1-9]/)  {
    print ("$value\n");
  }
}

出力:

*****3123123*****RAW

 text1
 text2

*****312312354***RAW

 text3

編集: print ("$value\n") の代わりに print ("$value") を使用すると、これが出力になります (値の前に 1 つの余分なスペースがあることに注意してください:

*****3123123*****RAW
 text1
 text2

 *****12354***RAW
 text3
4

5 に答える 5

3

このプログラムは、行から 10 進数を取得し、RAWそれを使用して出力ファイルに名前を付けます。コマンドラインのパラメーターとして入力ファイル名が必要です。

use strict;
use warnings;

@ARGV or die "Input file required as command-line parameter\n";

my $out;

while (<>) {
  if ( /(\d+)\*+RAW$/ ) {
    open $out, '>', "$1.out" or die $!;
    select $out;
  }
  print $_ if $out;
}
于 2012-06-08T13:17:09.543 に答える
2

行ごとのIOを使用した方がよい場合があります。

my $id = 0;
my $FILE = undef;

while (<>) {
    if (/RAW/) {
        close $FILE if defined $FILE;
        $id++;
        my $path = "File$id.txt";
        open $FILE, '>', $path or die "Could not open $path: $!";
    }
    print $FILE $_ if defined $FILE;
}
close $FILE if defined $FILE;

メールボックスファイルをメールごとに1つのファイルに分割するスクリプトの1つからコピーして適合させました。最初の行が一致しない場合は、スクリプトを調整する必要があります/RAW/

于 2012-06-08T13:08:00.893 に答える
2
use strictures;
use File::Slurp qw(read_file write_file);
my $raw = read_file('raw.txt', binmode => ':raw');
my $header = qr/^ (?= [*]+ [0-9]+ [*]+ RAW\n)/msx;
my @chunks = split $header, $raw;
# (
#     "*****3123123*****RAW\ntext1\ntext2\n",
#     "*****2312354***RAW\ntext3"
# )
for my $i (1..@chunks) {
    write_file("File$i.txt", {binmode => ':raw'}, $chunks[$i-1]);
}
于 2012-06-08T13:22:20.450 に答える
0

print ("$value\n");作成したコードをそのまま使用したい場合は、行をに置き換えるだけで、それprint ("$value");を手に入れることができます...

または、print削除\nchomp($value);て出力を維持する前にprint ("$value\n");

于 2012-06-08T13:30:24.527 に答える
0

これが私が思いついたものです。これは車輪の再発明だと感じずにはいられません。

#!usr/bin/perl
my $fi, $fi2;
my $line;
my $i;
my @lines;
my @filenameparts;
my $filename = "file_1.txt";

open($fi, "< original.txt");
@lines = <$fi>;
open ($fi2, " > $filename");

foreach (@lines)
{
if (($i > 0) and $_ =~ /RAW/)
{
    @filenameparts = split("_", $filename);
    foreach (@filenameparts)
    {
        print "Woooo".$_;
    }
    @filenameparts[1] = substr(@filenameparts[1], 0, @filenameparts[1].length() - 5);
    @filenameparts[1] = ($filenameparts[1] + 1);
    $filename = @filenameparts[0]."_".@filenameparts[1].".txt";
    print $filename;
    close($fi2);
    open ($fi2, " > $filename");
    $i = 0;
    print $fi2 $_;

}
else
{
    print $fi2 $_;
}
$i++;

}
于 2012-06-08T13:14:44.073 に答える