У меня есть два набора файлов csv: один содержит данные контрактов, а другой – содержащие контракты. Мне нужно объединить два файла csv с использованием общего поля (имя контракта) и вычислить общую сумму заключенных контрактов. Ссылка на файлы csv
До сих пор мне удалось объединить два csv-файла вместе и записать их в файл final.csv, но я не могу слить два файла csv с помощью общего поля (имя-контракта). Вот код.
<?php $nn = 0; foreach (glob("*.csv") as $filename) { if (($handle = fopen($filename, "r")) !== FALSE) { while (($data = fgetcsv($handle, 0, ",")) !== FALSE) { $c = count($data); for ($x=0;$x<$c;$x++) { $csvarray[$nn][] = $data[$x]; } $nn++; } fclose($handle); } } $fp = fopen('../final.csv', 'w');//output file set here foreach ($csvarray as $fields) { fputcsv($fp, $fields); } fclose($fp);?>
Это мой последний результат.
contractName,contractDate,completionDate,awardee,awardeeLocation,Amount Contract-2070-3,5/9/14,8/25/14,"SK Builders",Banke,200000 Contract-2070-5,3/18/14,4/8/14,"S engineering industries",Makwanpur,300000 Contract-2070-9,3/6/14,4/6/14,"Gourishankar nirman sewa",Lalitpur,400000 Contract-2070-10,2/6/14,6/16/14,"SK Builders",Banke,500000 contractname,status,bidPurchaseDeadline,bidSubmissionDeadline,bidOpeningDate,tenderid,publicationDate,publishedIn Contract-2070-1,Closed,6/12/14,6/13/14,6/13/14,2070/071/2,5/14/14,"Nagarik Daily" Contract-2070-2,Closed,6/10/14,6/11/14,6/11/14,16/070/71,5/12/14,"The Himalayan Times" Contract-2070-3,Current,3/8/14,3/9/14,3/9/14,DDC/Bag/Bridge/03-070/71,3/10/14,"Nagarik Daily" Contract-2070-4,Current,4/23/14,4/25/14,4/25/14,04(2070/071),4/9/14,"Hetauda sandesh" Contract-2070-5,Closed,4/23/14,4/25/14,4/26/14,04(2070/071),4/10/14,"Hetauda sandesh" Contract-2070-6,Current,4/23/14,4/25/14,4/27/14,04(2070/071),4/11/14,"Hetauda sandesh" Contract-2070-7,Current,4/23/14,4/25/14,4/28/14,04(2070/071),4/12/14,"Hetauda sandesh" Contract-2070-8,Current,4/23/14,4/25/14,4/29/14,04(2070/071),4/13/14,"Hetauda sandesh" Contract-2070-9,Closed,2/6/14,2/8/14,2/8/14,15/070/71,1/9/14,"The Himalayan Times" Contract-2070-10,Current,1/14/14,1/15/14,1/16/14,"13,2070/2071",1/6/14,"The Himalayan Times"
но конечный результат должен быть примерно таким.
contractname,status,bidPurchaseDeadline,bidSubmissionDeadline,bidOpeningDate,tenderid,publicationDate,publishedIn,contractDate,completionDate,awardee,awardeeLocation,Amount Contract-2070-1,Closed,6/12/14,6/13/14,6/13/14,2070/071/2,5/14/14,Nagarik Daily,,,,, Contract-2070-2,Closed,6/10/14,6/11/14,6/11/14,16/070/71,5/12/14,The Himalayan Times,,,,, Contract-2070-3,Current,3/8/14,3/9/14,3/9/14,DDC/Bag/Bridge/03-070/71,3/10/14,Nagarik Daily,5/9/14,8/25/14,SK Builders,Banke,200000 Contract-2070-4,Current,4/23/14,4/25/14,4/25/14,04(2070/071),4/9/14,Hetauda sandesh,,,,, Contract-2070-5,Closed,4/23/14,4/25/14,4/26/14,04(2070/071),4/10/14,Hetauda sandesh,3/18/14,4/8/14,S engineering industries,Makwanpur,300000 Contract-2070-6,Current,4/23/14,4/25/14,4/27/14,04(2070/071),4/11/14,Hetauda sandesh,,,,, Contract-2070-7,Current,4/23/14,4/25/14,4/28/14,04(2070/071),4/12/14,Hetauda sandesh,,,,, Contract-2070-8,Current,4/23/14,4/25/14,4/29/14,04(2070/071),4/13/14,Hetauda sandesh,,,,, Contract-2070-9,Closed,2/6/14,2/8/14,2/8/14,15/070/71,1/9/14,The Himalayan Times,3/6/14,4/6/14,Gourishankar nirman sewa,Lalitpur,400000 Contract-2070-10,Current,1/14/14,1/15/14,1/16/14,"13, 2070/2071",1/6/14,The Himalayan Times,2/6/14,6/16/14,SK Builders,Banke,500000
эта проблема не так сложна, вы всегда можете поместить данные в эти csv на массив и работать с ними, как это решение:
// 1st section $fh = fopen('awards.csv', 'r'); $fhg = fopen('contracts.csv', 'r'); while (($data = fgetcsv($fh, 0, ",")) !== FALSE) { $awards[]=$data; } while (($data = fgetcsv($fhg, 0, ",")) !== FALSE) { $contracts[]=$data; } // 2nd section for($x=0;$x< count($contracts);$x++) { if($x==0){ unset($awards[0][0]); $line[$x]=array_merge($contracts[0],$awards[0]); //header } else{ $deadlook=0; for($y=0;$y <= count($awards);$y++) { if($awards[$y][0] == $contracts[$x][0]){ unset($awards[$y][0]); $line[$x]=array_merge($contracts[$x],$awards[$y]); $deadlook=1; } } if($deadlook==0) $line[$x]=$contracts[$x]; } } // 3 section $fp = fopen('final.csv', 'w');//output file set here foreach ($line as $fields) { fputcsv($fp, $fields); } fclose($fp);
не// 1st section $fh = fopen('awards.csv', 'r'); $fhg = fopen('contracts.csv', 'r'); while (($data = fgetcsv($fh, 0, ",")) !== FALSE) { $awards[]=$data; } while (($data = fgetcsv($fhg, 0, ",")) !== FALSE) { $contracts[]=$data; } // 2nd section for($x=0;$x< count($contracts);$x++) { if($x==0){ unset($awards[0][0]); $line[$x]=array_merge($contracts[0],$awards[0]); //header } else{ $deadlook=0; for($y=0;$y <= count($awards);$y++) { if($awards[$y][0] == $contracts[$x][0]){ unset($awards[$y][0]); $line[$x]=array_merge($contracts[$x],$awards[$y]); $deadlook=1; } } if($deadlook==0) $line[$x]=$contracts[$x]; } } // 3 section $fp = fopen('final.csv', 'w');//output file set here foreach ($line as $fields) { fputcsv($fp, $fields); } fclose($fp);
не// 1st section $fh = fopen('awards.csv', 'r'); $fhg = fopen('contracts.csv', 'r'); while (($data = fgetcsv($fh, 0, ",")) !== FALSE) { $awards[]=$data; } while (($data = fgetcsv($fhg, 0, ",")) !== FALSE) { $contracts[]=$data; } // 2nd section for($x=0;$x< count($contracts);$x++) { if($x==0){ unset($awards[0][0]); $line[$x]=array_merge($contracts[0],$awards[0]); //header } else{ $deadlook=0; for($y=0;$y <= count($awards);$y++) { if($awards[$y][0] == $contracts[$x][0]){ unset($awards[$y][0]); $line[$x]=array_merge($contracts[$x],$awards[$y]); $deadlook=1; } } if($deadlook==0) $line[$x]=$contracts[$x]; } } // 3 section $fp = fopen('final.csv', 'w');//output file set here foreach ($line as $fields) { fputcsv($fp, $fields); } fclose($fp);
мне сложно объяснить код, потому что ям из испанской страны, поэтому мой английский не очень хорош … но я могу попробовать
в основном код имеет 3 раздела,
в разделе 1 откройте эти 2 файла и поместите содержимое в массив $ awards [] и $ контракты [], поэтому $ awards [0] – первая строка в наградах. CSV, $ awards [1] – вторая строка в awards.csv и т. д., то же самое в $ контрактах [].
в разделе 2,
Я сравниваю первое слово в каждом массиве, $ awards [x] [0] и $ контракты [x] [0].
первый, if
if ($ x == 0), должен сделать заголовок. во-первых, я удаляю первое слово contractname
с помощью функции unset
и присоединяюсь к $ awards [0] и $ контрактам [0], используя функцию array_merge
.
затем, используя те, for
я выбираю первое слово в каждой строке из массива $ контрактов и сравнивают с первым словом из каждой строки из массива $ awards. поэтому, if($awards[$y][0] == $contracts[$x][0])
проверьте, Contract-2070-3are
ли эти первые слова (ej. Contract-2070-3are
), если они являются одной и той же строкой, удалите его и объедините эти строки.
если эти слова arent совпадают, сохраните строку $ контрактов [x] в $ line массиве и продолжайте.
в разделе 3 сохраните содержимое из массива $ line в файле.
Это какой-то вопрос интервью? Вам нужно показать способность написать алгоритм или решить проблему реалистично?
Для большого набора данных я бы, вероятно, просто сбросил csv в sqlite db, одну таблицу за csv и связал их с запросом.
Или вы можете заполнить два ассоциативных массива с помощью каждого csv, $ контрактов и $ awards, используя поле объединения (имя контракта) в качестве ключа для обоих массивов.
Затем вы очищаете ключи и заполняете $ final array содержимым каждого массива для данного ключа:
$final = array(); $keys = array_keys($contracts); foreach($keys as $key) { $final[] = array_merge($contracts[$key], $awards[$key]); }