0

以下では、ディレクトリ内のファイルを調べて読み取り、最大500行のファイルで新しいディレクトリに保存します。これは私にとってはうまくいきます(ダニエルに感謝します)が、変更が必要です。alphanumベースのファイルに保存したいと思います。

まず、配列のアルファを数値で(すでに小文字で)ソートすることが、私が想定する最初のステップになります。

「a」で始まる各$incoming。"/。txt"のすべての行を取得し、それらを$save500。"/ a"のフォルダーに配置しますが、それぞれ最大500行です。(ソートの一番上にある最初から始めるのが最善だと思いますので、「a」ではなく「0」ですよね?)

数字で始まるすべての行は、$save500。"/num"に入ります。

どの行もa-z0-9以外で始まりません。

これにより、このフラットファイル方式を使用して、一致するファイルをより効率的に検索できるようになります。1つのフォルダに絞り込みます。

$nextfile=0;
    if (glob("" . $incoming . "/*.txt") != false){
     $nextfile = count(glob("" . $save500 . "/*.txt"));
     $nextfile++;
    }
    else{$nextfile = 1;}
    /**/
     $files = glob($incoming."/*.txt");
     $lines = array();
     foreach($files as $file){
     $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES));
    }
     $lines = array_unique($lines);
    /*this would put them all in one file*/
    /*file_put_contents($dirname."/done/allofthem.txt", implode("\n", $lines));*/
    /*this breaks them into files of 500*/
     foreach (array_chunk($lines, 500) as $chunk){
     file_put_contents($save500 . "/" . $nextfile . ".txt", implode("\n", $chunk));
     $nextfile++;
    }

それぞれが最大500行である必要があります。

後でmysqlに卒業します。これを行っているのは今から数か月だけです。

それだけでは不十分であるかのように。最初の2人のキャラクターを脱ぐことも考えました。subs a/0からz/zでディレクトリを作成します!

応答がないため、上記の間違ったアプローチである可能性があります。

しかし、私はaardvarkのような単語を1.txt a / aフォルダー(追加)に保存したいと思います。1.txtに500行が含まれていない限り、それをa /a2.txtに保存します。

したがって、500行がない限りxeniaはx / eフォルダの1.txtファイルに追加されるので、2.txtを作成してそこに保存します。

そうすれば、1トンをメモリにロードしたり、一致するものが含まれていないファイルや行をループしたりすることなく、これらの単語をより効率的に検索できるようになります。

みんな、ありがとう!

4

1 に答える 1

1

私はあなたが探していることをするべきであるいくつかのコードをここに書きました、それはパフォーマンスの美しさではありませんが、仕事をするべきです。安全な環境で試してください。データ損失の保証はありません;)

エラーがある場合はコメントしてください、ここではかなり遅いです;)私は少し眠らなければなりません;)

注:これは、すべての行に2文字以上ある場合にのみ機能します。;)

$nextfile=0;

if (glob("" . $incoming . "/*.txt") != false){
  $nextfile = count(glob("" . $save500 . "/*.txt"));
  $nextfile++;
}
else
{
  $nextfile = 1;
}



$files = glob($incoming."/*.txt");
$lines = array();
foreach($files as $file){
  $lines = array_merge($lines, file($file, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES));
}


$lines = array_unique($lines);


/*this would put them all in one file*/
/*file_put_contents($dirname."/done/allofthem.txt", implode("\n", $lines));*/
/*this breaks them into files of 500*/

// sort array
sort($lines);

// outer grouping
$groups     = groupArray($lines, 0);
$group_keys = array_keys($groups);

foreach($group_keys as $cKey) {
  // inner grouping
  $groups[$cKey] = groupArray($groups[$cKey], 1);

  foreach($groups[$cKey] as $innerKey => $innerArray) {
    $nextfile = 1;
    foreach(array_chunk($innerArray, 500) as $chunk) {
      file_put_contents($save500 . "/" . $cKey . "/" . $innerKey . "/" . $nextfile . ".txt", implode("\n", $chunk));    
      $nextfile++;
    }
  }

}


function groupArray($data, $offset) {

  $grouped = array();

  foreach($data as $cLine) {
    $key = substr($cLine, $offset, 1);
    if(!isset($grouped[$key])) {
      $grouped[$key] = array($cLine);
    } 
    else
    {
      $grouped[$key][] = $cLine;
    }
  }

  return $grouped;
}
于 2010-09-13T23:38:45.697 に答える