PHP: удалить строку из CSV, если идентификатор встречается несколько раз и столбец имеет определенное значение - PullRequest
0 голосов
/ 11 октября 2019

У меня есть данные, как показано ниже в файле CSV. Зеленые линии - это то, что я хотел бы сохранить.

В принципе, если у кого-то есть одна строка, я хочу сохранить ее.

Если они имеют несколько строк, я хочу удалить любую, где 3-й столбец равен A - Fully Fit.

После прохождения всего файла я хочу сохранить его поверх оригинала.

Я пытался написать код, но не уверен, что сегодня пятница, но логика ускользает от меня на данный момент.

Может быть только одна строка или десятки. Таким образом, если идентификатор имеет 1000 строк, я бы просто хотел удалить строки для этого идентификатора, где 4-й столбец «A - Полностью соответствует»

ОБНОВЛЕНИЕ

Этокод работает, но не уверен, что он самый оптимальный

enter image description here

// DECLARE ARRAYS
$a = Array();
$b = Array();
$c = Array();

// LOOP THROUGH FILE AND COLLECT DUPLICATES
if (($handle = fopen($filename, "r")) !== FALSE) {      

    while (($line = fgetcsv($handle, 4096, ",")) !== FALSE) {
        $a[$line[1]][] = 'SHAKKA';
    }

    foreach ($a as $k=>$v) {
        if (count($v)>1) {
            $b[] = $k;
        }
    }
}

// IF A DUPLICATE THEN REMOVE ROWS THAT ARE 'A - Fully Fit'
if (($handle = fopen($filename, "r")) !== FALSE) {      
    while (($golly = fgetcsv($handle, 4096, ",")) !== FALSE) {
        if (in_array($golly[1],$b) && $golly[3] == 'A - Fully Fit')  {
        }
        else {
            $c[] = $golly;
        }
    }
}
fclose($handle);

// WRITE THE FILE
$fp = fopen($filename, 'wa+');
foreach ($c as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);

1 Ответ

1 голос
/ 11 октября 2019
<?php


if (($handle = fopen($filename, "r")) !== FALSE) {      
    $new_rows = [];
    $hash_ids = [];

    while (($line = fgetcsv($handle, 4096, ",")) !== FALSE) {
        if($line[3] === 'A - Fully Fit'){
            if(isset($hash_ids[$line[1]])) continue;
            $hash_ids[$line[1]] = true;
        }
        $new_rows[] = $line;
    }

    fclose($handle);

    // WRITE TO THE FILE
    $fp = fopen($filename, 'wa+');
    foreach ($new_rows as $current_row) {
        fputcsv($fp,$current_row);
    }
    fclose($fp);
}

В приведенном выше коде мы поддерживаем хэш (ассоциативный массив) для каждого идентификатора. Если мы уже сталкивались с идентификатором A - Fully Fit, то пропускаем строку, иначе добавляем ее в список.

...