簡體   English   中英

PHP-比較兩個CSV文件,查找重復項並從其中一個文件中刪除匹配的行

[英]PHP- Compare two CSV files, look for duplicates and remove matching rows from one of the files

我正在努力學習PHP,自己動手做一些事情。 但是這部分讓我陷入困境。

我有兩個CSV文件,每個文件都有數百行。

CSV 1看起來像這樣:

名稱,電子郵件,興趣

CSV 2看起來像這樣:

僅電子郵件

我正在嘗試編寫一個腳本來比較兩個文件是否重復。 我只想保留重復項。 但是如您所見,CSV 2僅包含一封電子郵件。 如果CSV 2中不存在CSV 1中的電子郵件,則應刪除CSV 1中包含該電子郵件的行。

最終結果可以覆蓋CSV 1或創建一個名為“ final.csv”的新文件。

我將不勝感激。

我沒有碰到運氣就嘗試了以下方法:

egrep -v $(cat csv2.csv | tr '\n' '|' | sed 's/.$//') csv1.csv

grep -v -f csv22.csv csv1.csv >output-file

干杯,

這是一個腳本,它將遍歷兩個文件並輸出第三個文件,其中在file1中找到了file2中的電子郵件地址。

if (($file3 = fopen("file3.csv", "w")) !== FALSE) {
  if (($file1 = fopen("file1.csv", "r")) !== FALSE) {
    while (($file1Row = fgetcsv($file1)) !== FALSE) {
      if (($file2 = fopen("file2.csv", "r")) !== FALSE) {
        while (($file2Row = fgetcsv($file2)) !== FALSE) {
          if ( strtolower(trim($file2Row[0])) == strtolower(trim($file1Row[1])) )
            fputcsv($file3, $file1Row);             
        }
        fclose($file2);
      }
    }
    fclose($file1);
  }
  fclose($file3);
}

幾個注意事項:

  • 您可能需要為fgetcsv提供一些其他參數,具體取決於csv的結構(例如,定界符,引號)
  • 根據您列出每個文件內容的方式,此代碼讀取file1的第二列和file2的第一列。 如果這不是它們的實際位置,則需要更改括號中$file1Row[1]$file2Row[0] 列號從0開始。
  • 如果存在file3.csv,則腳本當前設置為覆蓋。 如果要附加而不是覆蓋,請將$file3 fopen的第二個參數更改為“ a”而不是“ w”

例:

file1.csv:

john,john@foobar.com,blah
mary,mary@blah.com,something
jane,jan@something.com,blarg
bob,bob@test.com,asdfsfd

file2.csv

mary@blah.com
bob@test.com

file3.csv(生成)

mary,mary@blah.com,something
bob,bob@test.com,asdfsfd

解決了! 問題出在Mac換行符上。 查看下面的代碼,以查看在代碼開頭和結尾處添加的內容以解決該問題。 感謝Crayon Violent的所有幫助!

ini_set('auto_detect_line_endings',TRUE);
if (($file3 = fopen("output.csv", "w")) !== FALSE) {
  if (($file1 = fopen("dirty.csv", "r")) !== FALSE) {
    while (($file1Row = fgetcsv($file1)) !== FALSE) {
      if (($file2 = fopen("clean.csv", "r")) !== FALSE) {
        while (($file2Row = fgetcsv($file2)) !== FALSE) {
          if ( strtolower(trim($file2Row[0])) == strtolower(trim($file1Row[1])) )
            fputcsv($file3, $file1Row);             
        }
        fclose($file2);
      }
    }
    fclose($file1);
  }
  fclose($file3);
}
ini_set('auto_detect_line_endings',FALSE);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM