[英]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);
}
}
它的作用基本上是:
运行它之后,您应该会得到理想的结果-根据您的情况,根据“所有”部分,多个文件的内容汇总:每周,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.