#php #json #csv
Вопрос:
это мои данные CSV
Имя Шулера | Шулейд | systemTransId | Дата транзакции | sttId | пол |
---|---|---|---|---|---|
mzimu | 01-022-1 | 20-007440 | 18/05/2021 | 12 | F |
mzimu | 01-022-1 | 20-007441 | 18/05/2021 | 13 | M |
mzimu | 01-022-1 | 20-007442 | 19/05/2021 | 14 | M |
Это мои ожидаемые результаты
{
"shulename": "mzimu",
"shuleid": "01-022-1",
"items":
[
{
"systemTransId": "20-007440",
"transactionDate": "18/05/2021",
"sttId": "12",
"gender": "F"
},
{
"systemTransId": "20-007441",
"transactionDate": "18/05/2021",
"sttId": "13",
"gender": "M"
},
{
"systemTransId": "20-007442",
"transactionDate": "19/05/2021",
"sttId": "14",
"gender": "M"
}
]
}
Комментарии:
1. У вас их больше одного
shulename
или это всегдаmzimu
так ? Кроме того, что вы пробовали до сих пор? Можете ли вы прочитать csv в php?2. В чем заключается вопрос?
3. да, имя Шулейд и шулейд никогда не изменятся
4. Я могу читать csv,но расположение не то, которое мне нужно, чтобы статический заголовок (shuleid, shulename) соединял данные
5. @Kinglish мне нужен крипт, который может создавать данные json из csv-файла, но в этом формате
Ответ №1:
Вы можете увидеть его рабочую демонстрацию здесь: https://www.tehplayground.com/400X1OR0vepmj7o6
Я подделал поток csv, чтобы показать, как использовать это с fgetcsv
$csv = "Shulename,Shuleid,systemTransId,transactionDate,sttId,gender
mzimu,01-022-1,20-007440,18/05/2021,12,F
mzimu,01-022-1,20-007441,18/05/2021,13,M
mzimu,01-022-1,20-007442,19/05/2021,14,M";
//$file = fopen("YOURFILE.csv","r");
$file = fopen('data://text/plain,' . $csv,'r');
$line = 0 ;
$keys = [];
while (($data = fgetcsv($file)) !== FALSE)
{
if ($line==0) {
// set up the array
foreach ($data as $d) $keys[]=strtolower($d);
$output = array(
$keys[0] => "",
$keys[1] => "",
"items" => array()
);
} else {
if ($line==1) {
$output[$keys[0]] = $data[0];
$output[$keys[1]] = $data[1];
}
$tmp = [];
for ($x=2; $x<count($keys); $x ) {
$tmp[$keys[$x]] = $data[$x];
}
$output['items'][]=$tmp;
}
$line ;
}
$output = json_encode($output, JSON_PRETTY_PRINT);
die("<pre>".print_r($output,1));
Ответ №2:
Согласно вашему комментарию, и если я правильно его понимаю shulename
, так будет всегда mzimu
и shuleid
будет всегда 01-022-1
.
Следовательно, продолжая с того, что вы написали, коды для создания нужного вам формата
if (($handle = fopen('revenue.csv', 'r')) === false) {
die('Error opening file');
}
$headers = fgetcsv($handle, 1024, ',');
$complete = array();
while ($row = fgetcsv($handle, 1024, ',')) {
$complete[] = array_combine($headers, $row);
}
fclose($handle);
// We have shulename and shuleid assigned statically
// because you said they will always be the same
$requiredFormat = ['shulename' => 'mzimu',
'shuleid' => '01-022-1'];
foreach ($complete as $item) {
## Notice the case here. The csv in the question is ucfirst and the required format is lower case
## php indexes are case sensitive
unset($item['Shulename']);
unset($item['Shuleid']);
$requiredFormat['items'][] = $item;
}
echo json_encode($requiredFormat);