2014-01-24 1 views
1

Я стараюсь научиться PHP и самостоятельно взламывать. Но эта часть меня застряла.PHP. Сравните два файла CSV, найдите дубликаты и удалите соответствующие строки из одного из файлов.

У меня есть два CSV-файла с сотнями строк.

CSV 1 выглядит следующим образом:

имя, адрес электронной почты, интерес

CSV 2 выглядит следующим образом:

только по электронной почте

Я пытаюсь написать скрипт для сравнения два файла, которые ищут дубликаты. Я хочу только сохранить дубликаты. Но, как вы можете видеть, CSV 2 содержит только электронное письмо. Если электронное письмо в CSV 1 НЕ СУЩЕСТВУЕТ в CSV 2, то строка, содержащая это письмо в 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 

приветствий,

MARC

+0

Я только что добавил несколько примеров, которые я пробовал без везения в свое первоначальное сообщение. –

+1

Ну, это не 'php', если вы не используете что-то вроде' exec() '... –

+0

Будучи новее этого, я не знаю о эквиваленте PHP для grep ... но, возможно, это не лучший метод в моем дело. Я буду запускать этот PHP-скрипт через cron ежедневно. –

ответ

1

Вот скрипт, который будет цикл через оба файла и вывести третий файл, где адреса электронной почты в файле2 находятся в файле1.

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 (например, разделитель, цитаты)
  • На основании того, как вы перечисляет содержимое каждого файла, этот код читает второй столбец файла1 и 1-й столбец файла2. Если это не так, как они расположены, вам нужно будет изменить число в скобке на $file1Row[1] и $file2Row[0]. Столбец # начинается с 0.
  • Сценарий в настоящее время установлен, чтобы перезаписать, если file3.csv существует. Если вы хотите, чтобы добавить вместо перезаписи, измените 2-й аргумент $file3fopen к "а" вместо "ш"

Пример:

file1.csv:

john,[email protected],blah 
mary,[email protected],something 
jane,[email protected],blarg 
bob,[email protected],asdfsfd 

файл2.CSV

[email protected] 
[email protected] 

file3.csv (генерируется)

mary,[email protected],something 
bob,[email protected],asdfsfd 
+0

wow, это потрясающе ... так щедро Я проведу некоторое время, проверяя его и дам вам знать. такой потрясающий! –

+0

Пока это не работает. Я даже пытался использовать два CSV-файла с одним столбцом на всякий случай, когда запятые отбрасывали вещи. Случается, что вывод file3.csv записывается, но он ничего не пишет. Я могу сказать, что это написано, посмотрев измененную дату после каждого прогона. Но нет данных. Итак, сценарий запускается, просто не захватывая данные и добавляя их в файл3 ... любые мысли? –

+0

@MarcB. Мое единственное подозрение в том, что, как я уже указывал, вам, вероятно, придется предоставить дополнительные аргументы 'fgetcsv' на основе того, как файлы csv фактически отформатированы. –

0

Решено! Проблема заключалась в разрыве строк в 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); 
+0

ага, да, это тоже. рад, что вы его отсортировали! –

+0

fyi вам не нужна эта последняя строка. установка чего-либо с помощью 'ini_set()' будет влиять только на материал, который происходит в конкретном скрипте при его запуске. IOW, он не вносит каких-либо постоянных изменений в ваш основной файл php.ini или что-то еще, и не влияет на другие скрипты, которые будут выполняться одновременно. –

+0

Еще раз спасибо ... как я могу связаться с вами для оплачиваемой работы? У меня скоро появятся другие вещи. –

Смежные вопросы