【问题标题】:PHP - alpha sort lines from several files in one directory and save them to files of "x" lines max in alpha named foldersPHP - alpha 对一个目录中多个文件的行进行排序,并将它们保存到 alpha 命名文件夹中最大“x”行的文件中
【发布时间】:2023-12-16 03:59:01
【问题描述】:

下面的内容会遍历目录中的文件,读取它们并将它们以最多 500 行的文件保存到新目录中。 这对我很有用(感谢丹尼尔)但是,我需要修改。 我想保存到基于字母数字的文件。

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

获取每个 $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 之类的单词保存到 1.txt 的 a/a 文件夹中(附加)。除非 1.txt 有 500 行,否则将其保存到 a/a 2.txt。

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

然后我将能够更有效地搜索这些单词,而无需将大量内容加载到内存中或循环遍历不包含匹配项的文件/行。

谢谢大家!

【问题讨论】:

  • 看我的回答,我已经更新了。

标签: php alpha glob


【解决方案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;
}

【讨论】:

  • 谢谢。我做了 16 小时 2day 所以,我觉得你。我会在早上测试并提供很多我相信的荣誉。非常感谢...
  • "未定义的对 grouparray() 的调用等..."(第一次调用它的地方。)所以我小写了 groupArray 的所有实例,但仍然是同样的错误。编辑-对不起我的坏事-我把整个例程都卡在了一个 if(我想运行这个){this sn-p} 中。将继续测试。
  • 它应该可以工作。我已经用一个虚拟数组对其进行了快速测试,然后尝试将函数移到顶部。否则重新发布您的来源。
  • 有效,我发现我有一些带有 _ 。 + 或 - 作为第二个字符(但从不作为第一个字符)所以,我需要为它们提供便利。所以,我想把 a-ardvark 放在 a/sc 文件夹中(sc = 特殊字符)。那可能吗?我现在还想搜索这些文件,因此在将新文件添加到 $incoming 文件/数组之前,它可以在推送保存之前检查文件夹中的欺骗。我是不是应该再问一个问题。我怎样才能让你知道我发布了这个新问题?
  • 将数组放在循环之外,因为它永远不会改变,这对性能更好;)
最近更新 更多