У меня есть два файла Excel:
test1.csv
ID Name Price
Q1 Quail 100
Q2 Quail 200
Q3 Quail 300
test2.csv
ID Name Price
Q1 Quail 100
Q4 Quail 400
Q2 Quail 500
Я хочу объединить эти файлы, поэтому, если одинаковыеИдентификатор существует в обоих файлах, он будет принимать дату из test2.csv.Остальная часть IDS будет брать данные из файла, который существует.Я пишу код для этого и работает хорошо.
function combine($csvs){
if (empty($csvs[0])) {die ("please specify main csv file as a parameter\n");}
// combine csv files from parallel processes while skipping duplicates
$ls = $csvs;
if (!empty($ls)) {
print "CSV files to be processed:\n";
print_r($ls);
$visited = array();
$csvout = fopen("combined.csv", "w");
$wrote_header = false;
$cnt = 0;
foreach ($ls as $csv) { // foreach file from an extraction process
$csv = trim($csv);
print "combinig $csv\n";
$csvfp = fopen ($csv, "r");
$head = fgetcsv ($csvfp); // skipping header
if (empty($wrote_header)) {
fputcsv($csvout, $head);
$wrote_header = true;
}
while ($row = fgetcsv ($csvfp)) {
$sku = $row[0];print_r($sku);
if (empty($sku)) $sku = $row[1];
if (empty($visited[$sku])) fputcsv($csvout, $row);
$visited[$sku] = 1;
$cnt++;
if ($cnt%5000 == 0) print "processed $cnt products, saved ".count($visited)." products\n";
}
fclose ($csvfp);
}
print "saved ".count($visited). " records\n";
unset ($visited);
#$command = "rm -f {$csv_file}_*";
#print $command."\n";
#exec ($command);
fclose($csvout);
} else print "no csv file";
}
Я называю эту функцию следующим образом:
$csvs = array('test2.csv','test1.csv');
combine($csvs);
И вот результат, который я получаю:
в сочетании.csv
ID Name Price
Q1 Quail 100
Q4 Quail 400
Q2 Quail 500
Q3 Quail 300
Прекрасно работает.Однако я хочу добавить в свой код некоторые дополнительные условия для IDS, которые существуют в обоих файлах.
Если цена из test2.csv больше или меньше от цены из test1.csv на 20%, тогда возьмитецена от test1.csv
Любая помощь, как я могу это сделать?