通过 PHP 导入 CSV 并将重复行视为 2 个条目

Importing a CSV via PHP and treating duplicate lines as 2 entries

出于个人统计目的,我通过一个 API 端点检查最近 500 次销售,该端点每 30 分钟向我发送一个 CSV return。

CSV 是这样制作的:

customerID Timestamp Sale Commission SignupDate
3656323 January 12 2022, 23:42 10.00 2.00 January 23 2019, 12:34
1456324 January 12 2022, 21:42 100.00 20.00 December 15 2018, 21:34
1456324 January 12 2022, 21:42 100.00 20.00 December 15 2018, 21:34
4213516 January 12 2022, 18:42 120.00 24.00 July 25 2020, 13:34

由于我每 30 分钟调用同一个端点,我得到相同的 CSV,并且大多数时候相同的行再次出现(我可能有完全相同的 table 连续 2 个调用) 因此,我通过检查客户 ID 和时间戳来消除所有重复项。我当时觉得还行。

我的问题是:正如您在上面的示例中看到的,客户、时间戳和金额在两行中是相似的。这不是错误,实际上是双重购买。就我而言,我不会使用第二行,因为它将被视为 duplicate.I 希望将其包含在我的统计信息中,但我不确定如何。

是否有针对此类特定问题的已知解决方案?

我的实际代码:(数据示例可能与代码中的不同)

$handle = fopen('https://url.com/csv/?limit=500','r');
if($handle){
  while ( ($data = fgetcsv($handle) ) != FALSE ) {
    if($flag) { $flag = false; continue; }
    $timestamp   = date("Y-m-d H:i:s", strtotime($data[0]));
    $signup_date = date("Y-m-d H:i:s", strtotime($data[5]));
    $amount      = str_replace(".", ".", $data[2]);
    $commission  = str_replace(".", ".", $data[3]);
    $exists = money_line_exists($timestamp, $data[1]);
    if(($exists == 0) && ($amount != "0.00") && (is_numeric($data[1]))){
      add_new_money($timestamp, $data[1], $amount, $commission, $data[4], $signup_date, $data[6], 1);
    }
  }
}

而money_line_exists()函数如下:

function money_line_exists($date, $id){
    $db = connect_db();
    $result = $db->query("SELECT * FROM money WHERE date_bill = '$date' AND user_id = '$id'");
    if($result->num_rows == 0) {
      return 0;
    } else {
      return 1 ;
    }
    $mysqli->close();
}

提前致谢

注意:为了清晰和格式,这是重新发布。

最简单的解决方案是添加另一个数据列(订单 ID)以确保行再次唯一。 如果真正的双重购买和第二次阅读看起来相似,则没有其他方法可以不包括或包括该行。

So is it correct to say that duplicates 'within a single response' keep, duplicates 'across responses' remove?

Correct. duplicates within I keep, duplicates across I remove

如果是这种情况,请在解析整个响应之前不要插入行。这样您就可以只针对之前插入的行查询数据库。

  $new_lines = [];
  while ( ($data = fgetcsv($handle) ) != FALSE ) {
    // ...
    $exists = money_line_exists($timestamp, $data[1]);
    if(($exists == 0) && ($amount != "0.00") && (is_numeric($data[1]))){
      $new_lines[] = [
         $timestamp,
         $data[1],
         $amount,
         $commission,
         $data[4],
         $signup_date,
         $data[6],
         1
      ];
    }
  }
  foreach ($new_lines as $line) {
      add_new_money(...$line);
  }