-2

Windows 7を使用しているperlでフォローするためのロジックを取得するのを誰かが手伝ってくれませんか.

C:\script>perl split_concatenate.pl large_file a または b (入力は大きなファイルで、後で処理するための値 a または b)。

  1. ファイルが 40KB (ある程度のサイズ) を超えているかどうかを確認し、コマンドを実行しない場合は "a" を選択します

コマンド -i large_file.txt -o large_file_new -a

選択が b の場合

コマンド -i large_file.txt -o large_file_new -b

そうしないと

それが 40KB+ より大きい場合は、40KB ごとにファイルを分割し (part1 になります)、file_part2 にある最初の「特定の文字列」を part1 に追加します。複数の「特定の文字列」がある場合は、処理のために保存します。次に、次の部分の次の「特定の文字列」で終わる後続のファイルを作成します。(「特定の文字列」は何らかの文字列で始まりますが、異なる値で終わります)。そのため、スクリプトは「特定の文字列」がpart2程度にあるかどうかを検索し、最初に利用可能なものを追加する必要があります。利用可能なものが1つしかない場合は、分割する必要はありません。ファイルは常に特定の文字列で終わる必要があるため。

次に、同じコマンドを処理します

コマンド -i filepart1.txt -o filepart1.dat -a コマンド -i filepart2.txt - o filepart2.dat (必要な場合) -a

また

コマンド -i filepart1.txt -o filepart1.dat -b コマンド -i filepart2.txt - o filepart2.dat (必要な場合) -b

この後、連結する必要があります。

filepart1.dat + filepart2.dat + filepartN =large_file.dat を連結します。

以下のコードを使用して最初にサイズを見つけ始めました。

#!/usr/bin/perl
    use strict;
    use warnings;
    use File::stat;

    my $filesize = stat("Full_File.txt")->size;

    print "Size: $filesize\n";

    exit 0;

私が学ぶことができるように、誰かが助けてくれれば素晴らしいことです。これが不可能な場合は、@ 500 行ごとにファイルが 40KB に達するので、ファイルが 1000 未満の場合は、500 行ごとに次の利用可能な「特定の文字列」を追加し、上記のコマンドを分割して処理する方が簡単だと思います行は2つだけ分割され、すでにeofに1つあるため、part2に追加する必要はありません。もっと簡単かもしれませんか?

より良い説明:

large_file.txt

xxx
xxxx
xxxx
xxxxx
var:value_var_v(1234)
xxxxxx
xxxxx
xxxxx
var:value_var_v(4567)
xxxxxxx
xxxxxx
var:value_var_v(abcd)
xxxxxxx  // first split happens here as here assume it is 40kb
xxxxxx
xxxxxxx
var:value_var_v(efgh)

これが大きすぎる場合は、5 行目で分割しますlarge_files_part1。その末尾には が含まれている必要がありますvar:value_var_v(1234)。5 行目以降は 9 行目で再び分割され、最後にlarge_files_part2and hasになります。var:value_var_v(4567)part3 は 12 行目まで進みvar:value_var_v(abcd)、最後に含めます。最初の分割の後に 1つしかない場合var:value_var_v?、両方の部分の行が約 500 である限り、2 つの部分だけで問題ありません。メイン ファイルに 1300 行ある場合、3 つの分割が必要です。各ファイルの末尾には、次に使用可能な「文字列」が必要です。したがって、1001 行目はvar:value_var_v(1234)1000 行目以降で最初に使用可能になります。文字列は常に var:value_var_v で始まり、任意のもので終わります。これが明確であることを願っています。

予想される出力: 最初のケース: したがって、文字列が 1 回しか出現しない場合、_part1.txt は約 40,000 になります。

xxx
xxxx
xxxx
xxxxx
var:value_var_v(1234)
xxxxxx
xxxxx
xxxxx
var:value_var_v(4567)
xxxxxxx
xxxxxx
var:value_var_v(abcd)
xxxxxxx  // split happened here
var:value_var_v(efgh)

_part2.txt
xxxxxxx
xxxxx
var:value_var_v(efgh)

これらのファイル (part1 と par2) に対して何らかの処理を行った後、再度連結します

_part1+_part2=ラージ+ファイル

連結後の最終的な大きなファイル:

    xxx
    xxxx
    xxxx
    xxxxx
    var:value_var_v(1234)
    xxxxxx
    xxxxx
    xxxxx
    var:value_var_v(4567)
    xxxxxxx
    xxxxxx
    var:value_var_v(abcd)
    xxxxxxx  // split happened here
    var:value_var_v(efgh)
    ****
  xxxxxxx
  xxxxx
  var:value_var_v(efgh)

2 番目の分割と連結のケース:

そのファイルが大きすぎて 80KB と言って、多くの文字列 "var:value_var() が最初の分割 @40KB の後にある場合、次の文字列が再び "var:value_var_v()" になる次の文字列を参照して分割を行います。それ以外の場合はサイズに基づいて、ファイル pat に次の使用可能な var:value_var_v() を含める必要があります。

元のファイル:

    xxx
    xxxx
    xxxx
    xxxxx
    var:value_var_v(1234)
    xxxxxx
    xxxxx
    xxxxx
    var:value_var_v(4567)  
    xxxxxxx 
- - // assume now split happens here as here assume it is 40kb there are two more strings starting with var:value_var_v, split after var:value_var_v(abcd) and print this string in previous parts eof. Then final part will be ending with var:value_var_v(efgh). keep as it is.
    xxxxxx
    xxxxxx
    xxxxx
    var:value_var_v(abcd)
    xxxxxxx  
    xxxxxx
    xxxxxxx
    var:value_var_v(efgh)



part1.txt 
   xxx
    xxxx
    xxxx
    xxxxx
    var:value_var_v(1234)
    xxxxxx
    xxxxx
    xxxxx
    var:value_var_v(4567)  
    xxxxxxx - - // split happens here as here assume it is 40kb
    var:value_var_v(abcd) - //prints next available string which is var:value_var_v(abcd)
    _part2.txt
    xxxxxx
    xxxxxx
    xxxxx
    var:value_var_v(abcd)  

// Here part1 and part2 ends with same string.

    _part3.txt
    xxxxxxx  
    xxxxxx
    xxxxxxx
    var:value_var_v(efgh) - This is last part and size should be below 40KB 

これらの part1、part2、part3 をすべて処理してから、大きなファイルに連結します。

連結後の最終ファイル

完全なフィレは次のようになります。

xxx
    xxxx
    xxxx
    xxxxx
    var:value_var_v(1234)
    xxxxxx
    xxxxx
    xxxxx
    var:value_var_v(4567)  
    xxxxxxx // split happened here in the first split assumed 40KB 
    var:value_var_v(abcd) 
      ******
    xxxxxx
   xxxxxx
    xxxxx
    var:value_var_v(abcd)  
     ******
   xxxxxxx  
    xxxxxx
    xxxxxxx
    var:value_var_v(efgh)
   ******

PS: 各部分で最後に処理されると、一意の値を取得し、連結中にそのまま保持します。

4

1 に答える 1

1

これはあなたが望むものにかなり近いと思います。

my $part_string = 'var:value_var_v';
my $file_count = 1;
my $total_length = 0;
my $max_length = 40000;

open (my $input, '<', $input_filename);
open (my $output, '>', "${output_filename}_part_${file_count}");
while (my $line = <$input>) {
  print $output $line;
  $total_length += length($line);
  if ($total_length > $max_length) {
    print $output "$part_string$file_count\n";
    close $output;
    $file_count++;
    open ($output, '>', "${output_filename}_part_${file_count}");
    $total_length = 0;
  }
}
if ($total_length > 0) {
  print $output "$part_string$file_count\n";
}
close $output;
于 2013-02-02T08:41:54.790 に答える