【问题标题】:PHP MYSQL import CSV and then compare and remove redundant entriesPHP MYSQL 导入 CSV 然后比较并去除多余的条目
【发布时间】:2012-03-26 12:58:32
【问题描述】:

我在这里遇到了一个特殊的问题。我有一个脚本,它基本上使用 php 中的fgetcsv() 将 CSV 文件导入数据库。这样做完全没有问题,我也可以使用 MySQL 语法 ON DUPLICATE KEY UPDATE 更新旧条目(我绝不是 MySQL 专家,因此我在这里问)。

以下是那部分代码:

$handle = fopen($file,"r");
fgetcsv($handle, 1000, ",");//skip first row since they are headers
while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop
{
  //read array values into vars
  $item1 = $fileop[0];
  $item2 = $fileop[1];
  $key = $fileop[2];
  // and a couple more

  // now INSERT / UPDATE data in MySQL table
  $sql = mysql_query("INSERT INTO table (item1,item2,key) 
    VALUES ('$item1','$item2','$key') 
    ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'");

}

这一切都很好。我坚持的是,一些条目可能已从实际的 CSV 中删除(因为密钥可能不再存在)。我想做的是从 MySQL 表中删除 CSV 中不再存在的条目。

意味着如果$key 从 CSV 中消失,也会删除数据库表中的该行。我想我会在对 MySQL 表运行插入/更新查询之前执行此操作?

如果有任何帮助,我将不胜感激。

【问题讨论】:

    标签: php mysql csv import compare


    【解决方案1】:

    只需记下您的密钥即可。

    将每个 $key 保存在你的 while 数组中,最后运行一个显示

    的查询
    DELETE FROM tabel WHERE key NOT IN (listofcommaseparatedkeysgoeshere)
    

    $arrayThatYouNeedToTest = array();
    $handle = fopen($file,"r");
    fgetcsv($handle, 1000, ",");//skip first row since they are headers
    while(($fileop = fgetcsv($handle, 1000, ",")) !== false) //read line by line into $fileop
    {
      //read array values into vars
      $item1 = $fileop[0];
      $item2 = $fileop[1];
      $key = $fileop[2];
      // and a couple more
    
      // now INSERT / UPDATE data in MySQL table
      $sql = mysql_query("INSERT INTO table (item1,item2,key) 
        VALUES ('$item1','$item2','$key') 
        ON DUPLICATE KEY UPDATE item1='$item1',item2='$item2'");
    
       $arrayThatYouNeedToTest[] = $key;    
    
    }
    
    $stringThatYouNeedToInspect = implode(",",$arrayThatYouNeedToTest);
    $queryYouREALLYneedToCheckFirst = "DELETE FROM tabel WHERE key NOT IN  (".$stringThatYouNeedToInspect.")";
    
    //$result = mysql_query($queryYouREALLYneedToCheckFirst);
    

    【讨论】:

    • 我理解你的想法背后的逻辑。你能再迭代一下,然后告诉我那个代码会是什么样子吗?我是 php 新手,编写这样的扩展代码对我来说有点新。
    • 嗯,应该没那么难,所以我很犹豫是否给你代码,因为你可能只是剪切和粘贴它,而我现在没有真正的测试方法和/或时间.但很快。被告知。你应该用它来理解应该发生的事情,而不是复制它!
    • 谢谢!我不想复制/粘贴我想更深入地了解它。到目前为止,我已经从查看人们发布的语法描述和示例中学到了我所知道的一切。我自己学习的最简单方法是做/查看示例,然后复制和扩展我所学的内容。
    • 巧合的是,当您将代码放在这里时,我只是在查看内爆数组的语法 :) 我会开始工作,很棒的东西,谢谢一百万。
    • 没问题,只要确保在将其放入 DELETE 之前进行一些 echo // var_dump 检查,因为您不想全部删除
    【解决方案2】:

    我在一个附属网站上做了与此非常相似的事情——只有不到 500,000 种产品。

    在您的数据库中,只需添加另一个名为“update_flag”或类似名称的列。将默认值设置为 0。当您从 CSV 文件添加项目时,请将 update_flag 设置为“1”。在您的“重复声明”中,将归档设置为“2”。我还添加了 2 个其他字段:“date_added”和“date_updated”。

    导入完成后,您可以统计旧项(待删除)、新添加项和已更新项。然后,您可以从 update_flag = 0 的表中简单删除

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-09-26
      • 2012-08-21
      • 1970-01-01
      • 2021-10-11
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      相关资源
      最近更新 更多