Дублировать CSV-файл путем группировки с элементом и фильтрации по другому - PullRequest
3 голосов
/ 31 октября 2019

Пожалуйста, в течение нескольких дней пытайтесь разрешить код. Для дублирования CSV-файла

идея состоит в том, чтобы просмотреть файл CSV, удалить дубликаты и разрешить строку с максимальным идентификатором

. Пример этого файла CSV FILE TO duduplicate

И результатом будет перезапись результата в csv

while (($this->lineInWork = fgetcsv($handle, 0, $delimiter)) !== false) {
        if ($index == 0) {
            if (!$this->checkHeaderFile()) {
                fclose($handle);
                return false;
            }
        } else {
            $idProject    = $this->columns[self::ID_PROJET]['index'];
            $TitleProject = $this->columns[self::Title_Project]['index'];
            $currentTitle = null;
            if ($this->lineInWork[$TitleProject] != $currentTitle)
            {
                $currentTitle = $this->lineInWork[$TitleProject];
                array_push($this->temporary_file[$currentTitle], $this->lineInWork);
            }
        }
        $index++;
    }
    fclose($handle);

Проблема не в том, чтобы переписатьфайл, но построить массив с правильными строками

1 Ответ

2 голосов
/ 31 октября 2019

Я бы, наверное, сделал два разных вида для этого (при условии, что я понял, что вам нужно). Я создал быстрый писатель CSV, который вы, возможно, уже имеете:

protected function saveToCsv($data, $path)
{
    $fp = fopen($path, 'w');

    foreach ($data as $fields) {
        fputcsv($fp, $fields);
    }

    fclose($fp);
}

Скрипт для фильтрации и сортировки:

# Create a storage array
$new    =   [];
# Increment array to determine header row
$i      =   0;
# Turn the csv file to array
$array  =   array_map('str_getcsv', file('original.csv'));
# Sort low to high by the ID_project
usort($array, function($a, $b){
    return ($a[0] < $b[0]);
});
# Loop the array and just re-assign over the top of each instance of value
# which will eventually assign the last value (highest)
foreach($array as $row) {
    if($i == 0) {
        # Save header to put back into the copy csv
        $header =   $row;
        $i++;
        continue;
    }
    # Assign by id so the values are unique and sortable after
    if(!isset($new[$row[2]]))
        $new[$row[2]]   =   $row;
}
# Resort by the app_id
ksort($new);
# Save the new CSV somewhere with the header merged
$this->saveToCsv(array_merge([$header], $new), 'copy.csv');
...