Реализовать левое соединение с PHP между двумя файлами CSVPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Реализовать левое соединение с PHP между двумя файлами CSV

Сообщение Anonymous »

Поскольку это решение было адаптировано из хорошо проглашенного ответа в другом месте, я не ожидал, чтобы столкнуться с проблемами.
Проблема: я хочу оставить присоединение file0.csv с file1.csv.

Код: Выделить всё

+-----------------+-------------+--------------+
| Manufacturer ID |    image    | description  |
+-----------------+-------------+--------------+
| SKU231          | image1.jpg  | A box.       |
| SKUAG1          | image22.jpg | Another box. |
| SKU21D          | image7a.png | A third box. |
+-----------------+-------------+--------------+
< /code>
file1.csv:
+--------+--------+--------+-------+-------+
|  mpn   | length | height | width | title |
+--------+--------+--------+-------+-------+
| SKU231 |     22 |     14 |    10 | Box 1 |
| SKUAG1 |     12 |      6 |     6 | Box 2 |
| SKU21D |      5 |      8 |     5 | Box 3 |
+--------+--------+--------+-------+-------+
< /code>
желаемый результат (file2.csv): < /p>
+-----------------+-------------+--------------+--------+--------+--------+-------+-------+
| Manufacturer ID |    image    | description  |  mpn   | length | height | width | title |
+-----------------+-------------+--------------+--------+--------+--------+-------+-------+
| SKU231          | image1.jpg  | A box.       | SKU231 |     22 |     14 |    10 | Box 1 |
| SKUAG1          | image22.jpg | Another box. | SKUAG1 |     12 |      6 |     6 | Box 2 |
| SKU21D          | image7a.png | A third box. | SKU21D |      5 |      8 |     5 | Box 3 |
+-----------------+-------------+--------------+--------+--------+--------+-------+-------+
Функция PHP к левому соединению file0.csv с File1.csv на идентификаторе производителя и mpn соответственно:

Код: Выделить всё

function my_csv_join(array $csv_input_file_array, $csv_output_file, $html_preview, $left_join_on, $right_join_on = NULL) {
if (count($csv_input_file_array) > 2) {
echo 'This function probably only works for 2 csv files being joined at a time.  Reapply iteratively if needed.  Exiting now.';
exit;
} else {
for ($x = 0; $x  $v) {
$final[$k] = $v; //basically keeping everything; $left just becomes $final
foreach ($right AS $kk => $vv) {
if ($v[$left_join_on] == $vv[$right_join_on]) {
foreach ($vv AS $key => $val)
$final[$k][$key] = $val;
} else {
foreach ($vv AS $key => $val)
$final[$k][$key] = NULL;
}
}
}
if ($html_preview == 'y') {
echo '
';
var_dump($final);
echo '';
}

// REINSTATE HEADERS
// var_dump($final[0]);
$indented_header = array(
0 => array_keys($final[0])
);
$re_headered_array = array_merge($indented_header, $final);

// write array to csv file
$file2 = fopen($csv_output_file, "w");
foreach ($re_headered_array as $line) {
fputcsv($file2, $line);
}

fclose($file2);
}
}
вызовать функцию my_csv_join () :

Код: Выделить всё

my_csv_join(array('C:\xampp\htdocs\kalugi\file0.csv','C:\xampp\htdocs\kalugi\file1.csv'), 'C:\xampp\htdocs\kalugi\file2.csv','y','Manufacturer ID','mpn');
Фактический результат показывает, что не все записи, соответствующие File0. Таким образом, некоторые ожидаемые ряды, которые удовлетворяли условию соединения, не были соединены. У нас есть null вместо их значений:

Код: Выделить всё

var_dump
результата:
array(3) {
[0]=>
array(8) {
["Manufacturer ID"]=>
string(6) "SKU231"
["image"]=>
string(10) "image1.jpg"
["description"]=>
string(6) "A box."
["mpn"]=>
NULL
["length"]=>
NULL
["height"]=>
NULL
["width"]=>
NULL
["title"]=>
NULL
}
[1]=>
array(8) {
["Manufacturer ID"]=>
string(6) "SKUAG1"
["image"]=>
string(11) "image22.jpg"
["description"]=>
string(12) "Another box."
["mpn"]=>
NULL
["length"]=>
NULL
["height"]=>
NULL
["width"]=>
NULL
["title"]=>
NULL
}
[2]=>
array(8) {
["Manufacturer ID"]=>
string(6) "SKU21D"
["image"]=>
string(11) "image7a.png"
["description"]=>
string(12) "A third box."
["mpn"]=>
string(6) "SKU21D"
["length"]=>
string(1) "5"
["height"]=>
string(1) "8"
["width"]=>
string(1) "5"
["title"]=>
string(5) "Box 3"
}
}
< /code>
Результат, который записан в $ file2 (file2.csv): < /p>
+-----------------+-------------+--------------+--------+--------+--------+-------+-------+
| Идентификатор производителя | изображение | Описание | mpn | Длина | высота | ширина | Название |
+-----------------+-------------+--------------+--------+--------+--------+-------+-------+
| Sku231 | Image1.jpg | Коробка. | | | | | |
| Skuag1 | Image22.jpg | Другая коробка. | | | | | |
| Sku21d | Image7a.png | Третья коробка. | Sku21d | 5 | 8 | 5 | Вставка 3 |
+-----------------+-------------+--------------+--------+--------+--------+-------+-------+
< /pre>
Почему 2 из строк не соединены, несмотря на файл.>

Подробнее здесь: https://stackoverflow.com/questions/599 ... -csv-files
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»