0

我需要从我的文件系统中打开 2 个文件。这两个文件都是 csv 文件。我需要确定两个文件的差异:所以我需要检查昨天与今天相比内容有何变化。

每天将恰好有 1 个文件。这些文件是根据时间戳标记的,因此没有真正的模式。(澄清一下,是的,它是 unix 时间戳,但不是每天都在同一时间创建文件)例如,昨天的文件被称为:file-1601926309814.csv,前一天的文件(因为今天还没有创建文件):file-1601847963649.csv

我环顾四周,发现了 filemtime,但我不确定这是否有那么大的帮助。我想出的另一个选择是检查glob目录中的文件,但我不确定这是否是一个好的解决方案。

到目前为止我的代码:

<?php

// Simple script to determine a negative Delta between 2 files
// These 2 files are taken from a given destination and pushed
// through an array diff. The result will be written in a new 
// file.

$path = "G:\\interfaces\\out\\SAP\\Shopartikel\\";
$sFileYesterday  = "testfile_1.csv";
$sFileToday      = "testfile_2.csv";

$aItemsYesterday = array();
$aItemsToday     = array();
$aOutput         = array();

// get all files from yesterday
$fHandleYesterday = fopen($path.$sFileYesterday, "r");
while (($line = fgetcsv($fHandleYesterday, 0, ";")) !== false) {
    $aItemsYesterday[] = $line[0];
}

// get all files from today
$fHandleToday = fopen($path.$sFileToday, "r");
while (($line = fgetcsv($fHandleToday, 0, ";")) !== false) {
    $aItemsToday[] = $line[0];
}

// determine the difference
$aOutput = array_diff($aItemsYesterday, $aItemsToday);

var_dump($aOutput);

如上所述,输出是正确的,但我还需要获取正确的文件。

有任何想法吗?

4

1 回答 1

2

无论如何,您都可以在文件夹中组织文件。

按照您的建议使用 glob 获取所有文件名并遍历它们并将具有 UNIX 时间戳的名称更改为日期时间戳。

$path = "path";

foreach (glob($path . "*.csv") as $filename) {
    // only rename files that have not been renamed before. 
    if(strlen($filename) == 17){  // assumes the filename is [UNIX].csv
         rename($path . $filename, $path . date("Y-m-d", (int)$filename/1000));
    }
}

这应该将文件重命名为其日期,以便轻松选择正确的文件。

如果您不想重命名文件,另一种方法是创建一个“翻译表”数组,其中 Ymd 日期作为键,UNIX 名称作为值。

这样你就知道 $arr["2020-10-06"] 是今天的文件,无论 UNIX 时间戳是什么。

$path = "path";

foreach (glob($path . "*.csv") as $filename) {
    $arr[date("Y-m-d", (int)((int)substr($filename, -17)/1000))] = $path . $filename;
}

$sFileYesterday  = $arr[date("Y-m-d", time()-86400)];
$sFileToday      = $arr[date("Y-m-d", time())];

这段代码每天都会变得越来越慢,因为每天还有一个文件需要“翻译”。
您也许可以通过保存翻译数组的 json 并使用 array_diff 或其他东西找到“新”文件来加快速度。
不确定它会比迭代数组和执行“翻译”更快,但你必须看看它什么时候变慢。

示例:https ://3v4l.org/cb4Mp

于 2020-10-06T08:24:11.723 回答