PHP-alpha对一个目录中多个文件的行进行排序,并将它们保存到;x";alpha命名文件夹中的最大行数

PHP-alpha对一个目录中多个文件的行进行排序,并将它们保存到;x";alpha命名文件夹中的最大行数,php,alpha,glob,Php,Alpha,Glob,下面的内容将遍历目录中的文件,读取它们并将它们保存在最多500行的文件中,保存到新目录中。 这对我来说很好(谢谢丹尼尔),但我需要修改。 我想保存到基于alpha num的文件 首先,我假设第一步是对数组进行字母数字排序(已经小写) 抓取每个$incoming./.txt中以“a”开头的所有行,并将它们放入$save500的文件夹中。“/a”,但每个最多500行。 (我想最好从排序顶部的第一个开始,所以“0”不是“a”,对吗?) 所有以数字开头的行进入$save500。“/num” 除a-z0-

下面的内容将遍历目录中的文件,读取它们并将它们保存在最多500行的文件中,保存到新目录中。 这对我来说很好(谢谢丹尼尔),但我需要修改。 我想保存到基于alpha num的文件

首先,我假设第一步是对数组进行字母数字排序(已经小写)

抓取每个$incoming./.txt中以“a”开头的所有行,并将它们放入$save500的文件夹中。“/a”,但每个最多500行。 (我想最好从排序顶部的第一个开始,所以“0”不是“a”,对吗?)

所有以数字开头的行进入$save500。“/num”

除a-z0-9外,所有管线均不得以任何东西开头

这将允许我使用此平面文件方法更有效地搜索匹配的文件。将其缩小为一个文件夹

$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。现在才做了几个月

似乎这还不够。我甚至想过去掉前两个角色。使用subs a/0到z/z制作目录

可能是上面的错误方法,因为没有响应

但是我想要一个像aardvark这样的单词保存到a/a文件夹的1.txt中(追加)。除非1.txt有500行,否则将其保存到a/a 2.txt

所以xenia会被附加到x/e文件夹1.txt文件中,除非有500行,所以创建2.txt并保存在那里

这样,我就可以更高效地搜索这些单词,而无需将大量内容加载到内存中,也无需遍历不包含匹配项的文件/行


谢谢大家

我在这里写了一些代码,这些代码应该可以满足您的需求,它不是一种性能美,但应该可以满足您的需求。在安全的环境中试用,不保证任何数据丢失;)

注释如果有任何错误,现在已经很晚了;)我得睡一会儿;)

注意:只有当每行至少有2个字符时,此选项才有效!;)


看我的答案,我已经更新了。谢谢。我每天做了16个小时,所以,我觉得是的。我相信我会在早上进行测试,并提供更多的荣誉。感谢so mich…“对第行的grouparray()的未定义调用等…”(第一次调用它的地方。)所以我将grouparray的所有实例都小写了,仍然是相同的错误。编辑-抱歉我的错误-我把整个例程都卡在了if(我想运行这个){this snippet}中。将继续测试。它应该可以工作。我已经用一个虚拟数组快速测试了它,然后尝试将函数移到顶部。否则,请重新发布你的源代码。工作,我发现我有一些带有或者——作为第二个角色(但绝不是第一个),我需要促进这些。所以,我想把a-ardvark放在a/sc文件夹中(sc=special character)。可能吗?我现在还想搜索这些文件,以便在将新文件添加到$incoming file/array之前,它可以在推动保存之前检查文件夹中是否存在重复文件。我应该再问一个问题吗。我如何让您知道我发布了这个新问题?将数组置于循环之外,因为它永远不会改变,这对性能更有利;)
$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;
}