php-скрипт для чтения csv-файла в json со статическим заголовком перед элементами

#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);