Я пытаюсь создать (программировать) интерфейс с 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"
Я не могу понять, как это сделать … какие-либо предложения?
Ты можешь использовать 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];
Надеюсь, это поможет!
Других решений пока нет …