PHP - альфа-сортировка строк из нескольких файлов в одном каталоге и сохранение их в файлы максимум по «х» строк в альфа-именованных папках - PullRequest
0 голосов
/ 14 сентября 2010

Это ниже просматривает файлы в каталоге, считывает их и сохраняет их в файлах не более 500 строк в новый каталог.Это прекрасно работает для меня (спасибо Даниэль), но мне нужна модификация.Я хотел бы сохранить файлы на основе альфа-номера.

Сначала сортировка массива по алфавиту численно (уже в нижнем регистре) будет первым шагом, который я предполагаю.

Схватите все строки в каждом $входящие. "/. txt", которые начинаются с "a" и помещают их в папку по $ save500. "/ a", но не более 500 строк каждая.(Я думаю, что было бы лучше начать с первого в верхней части сортировки, поэтому «0», а не «a», верно?)

Все строки, начинающиеся с цифры, идут в $ save500. "/num".

Ни одна из строк не будет начинаться с чего-либо, кроме a-z0-9.

Это позволит мне более эффективно искать совпадения в моих файлах, используя этот метод flatfile.Сужение до одной папки.

$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 позже.Только делаю это пару месяцев.

Как будто этого недостаточно.Я даже думал снять первые два символа.Создание каталогов с подпрограммами от a / 0 до z / z!

Может быть неправильный подход выше, поскольку нет ответов.

Но я хочу, чтобы слово типа aardvark было сохранено в 1.txt в a /папка (добавление).Если в 1.txt нет 500 строк, сохраните его в формате a / a 2.txt.

Таким образом, xenia будет добавлена ​​в файл 1.txt папки x / e, если нет 500 строк, поэтому создайте 2.txt исохраните его там.

Затем я смогу более эффективно искать эти слова, не загружая тонну в память и не просматривая файлы / строки, которые не будут содержать совпадений.

Спасибо всем!

1 Ответ

1 голос
/ 14 сентября 2010

Я написал здесь некоторый код, который должен делать то, что вы ищете, это не красота, а работа.Попробуйте в безопасной среде, без гарантии потери данных;)

Прокомментируйте, если есть какие-либо ошибки, здесь довольно поздно;) Мне нужно немного поспать;)

ПРИМЕЧАНИЕ: Этот работает только если каждая строка имеет как минимум 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;
}
...