如何解决csv文件中的重复问题?使用PHP [关闭]

b1uwtaje  于 2023-09-28  发布在  PHP
关注(0)|答案(2)|浏览(97)

已关闭,此问题需要details or clarity。它目前不接受回答。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

上个月关门了。
这篇文章上个月被编辑并提交审查,未能重新打开帖子:
原始关闭原因未解决
Improve this question
我使用PHP。我正在从服务器收集csv文件。在服务器上,每日文件获取附加到它的数据行。
我需要每十分钟更新一次我的数据所有者,只更新新数据(如果有的话)。
因此,我需要收集csv文件,将其与以前收集的版本进行比较,以查看其中是否有任何新行,然后,如果有,将它们发送给数据所有者。
我使用PHP。你会怎么做?你能数一下行数吗?第一个字段是一个时间戳-所以这可能是有用的?
下面是行的外观:

"2023-08-01 05:54:18","Lolla","[email protected]", .... 20 fields more
"2023-08-01 17:44:27","Dave","[email protected]", .... 20 fields more
"2023-08-01 17:42:23","John","[email protected]", .... 20 fields more

PHP的任何建议非常感谢!

xxls0lw8

xxls0lw81#

如果时间戳用户名对是一个uniq标识符,则可以运行join来只提取不成对的行。
如果你有一个例子

"2023-08-01 05:54:18","Lolla"
"2023-08-01 17:44:27","Dave"
"2023-08-01 17:42:23","John"

然后

"2023-08-01 05:54:18","Lolla"
"2023-08-01 17:44:27","Dave"
"2023-08-01 17:42:23","John"
"2023-08-01 17:42:28","Pam"
"2023-08-01 19:38:15","John"

您可以使用Miller并运行

mlr --csv -N join --ur --np -j 1,2 -f first.csv second.csv

得到

2023-08-01 17:42:28,Pam
2023-08-01 19:38:15,John
  • -j将1和2个字段设置为键
  • --ur从正确的文件发出未配对的记录
  • --np不发出配对记录
db2dz4w8

db2dz4w82#

因为这些行都有时间戳,所以它们可能是唯一的,所以你可以保存上一次迭代的最后一行,在当前文件中搜索它,然后获取它之后的内容:

$file = '/some/watched/file.txt';
$tail = './saved_last_line.txt';

$last_line = @file_get_contents($tail);

copy($file, $tail) && ($fp = fopen($tail,'r+')) || exit(1);

if ( $last_line !== false ) {
    do {
        $line = fgets($fp);
        $found = ($line === $last_line);
    } while ( !$found && $line !== false );
    if ( !$found )
        rewind($fp);
}

$new_content = stream_get_contents($fp);

if ( $new_content !== "" ) {
    $pos = strrpos($new_content, "\n", -2);
    $last_line = ( false === $pos ? $new_content : substr($new_content, $pos+1) );
}

ftruncate($fp, 0);
rewind($fp);
fwrite($fp, $last_line);
fclose($fp);

# THEN DO YOUR STRUFF
echo $new_content;

相关问题