繁体   English   中英

PHP如何遍历目录并将所有以相同字符串结尾的文件合并到该名称的单个文件中

[英]PHP How can I iterate over a directory and merge all files that end with same string in a single file of that name

描述:

我有一个包含大量文件的目录,如下所示:

2013_11_weekly.csv 
2013_10_weekly.csv 
2013_08_weekly.csv 
2013_09_weekly.csv 
2013_11_any_string.csv 
2013_10_any_string.csv

问题:

如何遍历目录并将所有以相同字符串结尾的文件合并为单个文件?

最终结果将是一个包含以下文件的目录。

weekly.csv 
any_string.csv 
...

研究:

我有合并所有所有文件的以下代码段。

<?php

$files = glob("*.csv");
$out = fopen("merged_files.csv", "w");
foreach($files as $file){
    fwrite($out, file_get_contents($file));
}
fclose($out);
echo "files merged";

?>

如何修改脚本以实现上述目标?

我知道我可能必须使用数组函数, str_函数以及正则表达式函数。

尝试此操作-它假定了将文件分组的规则(2013_ [两位数字] _ [grouping_string])。 一个不错的技巧是在正则表达式中使用?P登录,它将把聚合字符串放入'string_aggr'键下的$ maches数组中:

$filenameRegexp = '/2013_[0-9]{2}_(?P<string_aggr>.+)\.csv/';
foreach (glob('*.csv') as $filename) {
   if (preg_match($filenameRegexp, $filename, $matches)) {
      $aggrFilename = $matches['string_aggr'] '.csv';
      file_put_contents($aggrFilename, file_get_contents(filename), FILE_APPEND);
   }
}

它的作用基本上是:

  1. 查找所有与模式“ * .csv”匹配的文件;
  2. 取得每个文件,并检查其是否与模式“ 2013_ [两位数] _ [anything] .csv”匹配
  3. 如果与模式匹配-获取其内容,然后将其附加到名为“ anything.csv”的文件的末尾。

运行它之后,您应该会得到理想的结果-根据您的情况,根据“所有”部分,多个文件的内容汇总:每周,any_string等。

这非常简单,您只需要弄清楚如何从文件名中获取公用名即可。

在我的示例中,我在第8个位置分割了文件名( 2013_11_weekly.csv变为weekly.csv ):

$files = glob("*.csv");
$out = array();
foreach($files as $file) {
    $name = substr(basename($file), 8);
    if (!isset($out[$name])) {
        $out[$name] = fopen($name, "w");
    }
    fwrite($out[$name], file_get_contents($file));
}
foreach ($out as $f) {
    fclose($f);
}

这可能对您有帮助。 如果您没有得到正确的答案,请告诉我。 使用php合并多个csv文件

您可以创建一个数组,将所有值连接到数组中,然后创建这些文件

例如 :

$files = glob("*.csv");
$files_content = array();

//parse all your files
foreach($files as $file){
    //get the suffix (ie '_weekly')
    $filename_end = substr(basename($file), 8);
    if(!isset($files_content[$file])) $files_content[$file] = "";
    //concatenate strings
    $files_content[$file] .= file_get_contents($file);
}

//and then create those files
foreach($fields_content as $filename => $content){
    $out = fopen($filename, "w");
    fwrite($out, $content);
    fclose($out);
}

而不是fwrite,应该使用file_put_content 此功能能够将数据追加到文件中。

描述

int file_put_contents(字符串$ filename,混合$ data [,int $ flags = 0 [,resource $ context]])

此函数与依次调用fopen(),fwrite()和fclose()来将数据写入文件相同。

如果文件名不存在,则创建文件。 否则,除非设置了FILE_APPEND标志,否则现有文件将被覆盖。

产生如下代码(未经测试,仅用于理解):

<?php
$files = glob("*.csv");
foreach($files as $file){
    // get substring 6 chars before the last 4 chars (.csv)
    $type = substr($file, -4, -10)
    // switch based on the substring $type
    switch($type) {
        case "weekly":
            file_put_content("merged_files_weekly.csv", file_get_contents($file), FILE_APPEND);
        break;
        case "string" :
            file_put_content("merged_any_string.csv", file_get_contents($file), FILE_APPEND);
        break;
        default:
            // do nothing
        break;
    }

}
echo "files merged";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM