通过 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);
}
出于个人统计目的,我通过一个 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);
}