Переопределить CSV как массив, используя первую строку в качестве ключей - PullRequest
0 голосов
/ 21 февраля 2020

Давайте предположим, что у меня есть файл CSV, который выглядит следующим образом:

[Line 1]: ID, Name, Birthday,   Phonenumber, Email
[Line 2]:
[Line 3]: 1,  Jim,  1978-02-01, 555-23-256,  jim.doe@donotreply.com
[Line 4]: 2,  Mia,  1985-12-21, 555-23-876,  mia@donotreply.com      
[Line 5]: 3,  Wil,  1962-05-07, 555-23-456,  wil.doe@donotreply.com  

Теперь я пытаюсь обернуть голову вокруг этого вопроса:
Как я могу проанализировать этот файл с помощью PHP для получить следующий массив?

$people = array(

[1] = array(
       [Name] => "Jim",
       [Birthday] => "1978-02-01",
       [Phonenumber] = "555-23-256",
       [Email] => "jim.doe@donotreply.com",
       ),

...

);

Есть идеи?

1 Ответ

0 голосов
/ 21 февраля 2020

Используйте fopen и fgetcsv

. Для этого вам необходимо сначала написать функцию для извлечения данных из CSV и сохранения их в переменной, нижеприведенная функция сделает это, используя fopen.

Сначала вам понадобится функция для чтения CSV:

function utf8_fopen_read($fileName) {

  $fc = iconv('windows-1250', 'utf-8//IGNORE', file_get_contents($fileName));
  $handle = fopen("php://memory", "rw");

  fwrite($handle, $fc);
  fseek($handle, 0);

  return $handle;

}

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

Теперь мы собираемся вызвать функцию выше и сохранить результаты в $data, используя while l oop, мы собираемся перебрать весь CSV и сохранить всю информацию в $people строка за строкой.


Заполнение массива:

$people = [];

if(($handle = utf8_fopen_read('path/to/csv.csv')) !== FALSE) {

  while(($data = fgetcsv($handle, 0, ',')) !== FALSE) {

    $people[$i] = [];

    for($c = 0; $c < count($data); $c++) {

      $info = $data[$c];

      if($i == 0) $fields[$c] = str_replace(' ', '', $info);
      if($i > 0) $people[$ii][$fields[$c]] = $info;

    }

    if($i > 0) $ii++;
    $i++;

  }

  fclose($handle);

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...