Сопоставление значений столбца одного CSV со значениями заголовка другого CSV и запись нового файла CSV

Я пытаюсь создать (программировать) интерфейс с PHP, который принимает 1 файл CSV (csv1) и использует заголовки из этого файла CSV для сопоставления столбцов другого файла CSV (csv2). Я смог получить отображение в массиве со следующим:

//csv1
$data = array_map('str_getcsv', file('csv1.csv'));

//just get the first line of the csv1's values
$csv1Headers = array_shift($data);

//csv2
$data2 = array_map('str_getcsv', file('csv2.csv'));

//get csv2's header values
$csv2Headers = array_shift($data2);

//set variables based on csv2's headers
$csv2header1 = array_search("header1", $csv2Headers);
$csv2header2 = array_search("header2", $csv2Headers);
$csv2header3 = array_search("header3", $csv2Headers);
$csv2header4 = array_search("header4", $csv2Headers);//create main array
$mappedArray = array();

//create individual arrays based on csv1's header values
foreach($csv1Headers as $header) {
$mappedArray[$header] = array();
}

//Set the
foreach ($data2 as $row) {
if($row[$csv2header1]) { $mappedArray['csv1header1'][] .= $row[$csv2header1]; } else { $mappedArray['csv1header1'][] .= ''; }
if($row[$csv2header2]) { $mappedArray['csv1header2'][] .= $row[$csv2header2]; } else { $mappedArray['csv1header2'][] .= ''; }
if($row[$csv2header3]) { $mappedArray['csv1header3'][] .= $row[$csv2header3]; } else { $mappedArray['csv1header3'][] .= ''; }
if($row[$csv2header4]) { $mappedArray['csv1header4'][] .= $row[$csv2header4]; } else { $mappedArray['csv1header4'][] .= ''; }
}

если я бегу print_r($mappedArray) Я получаю следующий вывод:

Array
(
[csv1Header1] => Array
(
[0] => csv2DataMappedToHeader1
[1] => csv2DataMappedToHeader1
[2] => csv2DataMappedToHeader1

)

[csv1Header2] => Array
(
[0] => csv2DataMappedToHeader2
[1] => csv2DataMappedToHeader2
[2] => csv2DataMappedToHeader2

)

[csv1Header3] => Array
(
[0] => csv2DataMappedToHeader3
[1] => csv2DataMappedToHeader3
[2] => csv2DataMappedToHeader3

)

[csv1Header4] => Array
(
[0] => csv2DataMappedToHeader4
[1] => csv2DataMappedToHeader4
[2] => csv2DataMappedToHeader4
)
)

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

"csv1Header1", "csv1Header2", "csv1Header3", "csv1Header4""csv2DataMappedToHeader1","csv2DataMappedToHeader2","csv2DataMappedToHeader3","csv2DataMappedToHeader4""csv2DataMappedToHeader1","csv2DataMappedToHeader2","csv2DataMappedToHeader3","csv2DataMappedToHeader4""csv2DataMappedToHeader1","csv2DataMappedToHeader2","csv2DataMappedToHeader3","csv2DataMappedToHeader4"

Я не могу понять, как это сделать … какие-либо предложения?

0

Решение

Ты можешь использовать fputcsv записать свой вывод в файл:

$array = ('apple', 'banana', 'carrot', 'date');
$fh = fopen('output.csv', 'w');
fputcsv($fh, $array);

output.csv:

"apple","banana","carrot","date"

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

Как общий совет, всякий раз, когда вы повторяете операцию более двух раз, стоит абстрагироваться от этой операции, чтобы создать более общую версию. Например, этот код:

//set variables based on csv2's headers
$csv2header1 = array_search("header1", $csv2Headers);
$csv2header2 = array_search("header2", $csv2Headers);
$csv2header3 = array_search("header3", $csv2Headers);
$csv2header4 = array_search("header4", $csv2Headers);

может быть реорганизован; вместо того, чтобы иметь набор переменных с похожими именами, используйте for зациклить и поместить данные в массив:

$csv2hdr = array();
for ($i=1; $i<5; $i++) {
# searches for "header1", "header2", etc.
# stores them in $csv2hdr[1], $csv2hdr[2], etc.
$csv2hdr[$i] = array_search("header$i", $csv2Headers);
}

Выглядит так, как будто вы используете оператор добавления строки (.=) когда вы должны использовать = оператор здесь:

$mappedArray['csv1header1'][] .= $row[$csv2header1];

Надеюсь, это поможет!

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]