2013-12-12 2 views
1

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

Мне нужно только около 5 из этих столбцов.

Я пытаюсь превратить их в более управляемый формат (переменные?), Поэтому я могу выполнить проверку их значений.

У меня есть следующий код:

$headers = array('NAME', 'EMAIL'); 
    $picked  = array(); 
    $theData = array(); 
    $isFirstRow = true; 
    if (($handle = fopen($uploadedFile, "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
      $numCols = count($data); 
      $row  = array(); 

      if($isFirstRow) { 
       for($c=0; $c<$numCols; $c++) { 
        if(!in_array($data[$c], $headers)) { 
         continue; 
        } else { 
         $picked[] = $c; 
         $isFirstRow = false; 
        } 
       } 
      } else { 
       for($c=0; $c < $numCols; $c++) { 
        if(in_array($c, $picked)) { 
         $row[] = $data[$c]; 
         $theData[] = $row; 
        } 
       } 
      } 
     } 
     fclose($handle); 


    } 
    var_dump($theData); 

Это выводит следующее:

array (size=xxxxxx) 
    0 => 
    array (size=1) 
     0 => string 'John Doe' (length=8) 
    1 => 
    array (size=2) 
     0 => string 'John Doe' (length=8) 
     1 => string '[email protected]' (length=16) 
    2 => 
    array (size=1) 
     0 => string 'Jane Doe' (length=8) 
    3 => 
    array (size=2) 
     0 => string 'Jane Doe' (length=8) 
     1 => string '[email protected]' (length=16) 

Очевидно, что это не ожидаемый выход

Я хотел бы что-то подобное:

array (size=xxxx) 
    0 => 
    array (size=1) 
     0 => string 'John Doe' (length=8) 
     1 => string '[email protected]' (length=16) 
    1 => 
    array (size=2) 
     0 => string 'Jane Doe' (length=8) 
     1 => string '[email protected]' (length=16) 

Я не уверен, почему он добавляет дополнительные массивы.

У кого-нибудь есть идея?

Благодаря

EDIT

Мой CSV выглядит следующим образом;

NAME,EMAIL 
John Doe,[email protected] 
Jane Doe,[email protected] 
+0

Ваш, если/иначе блок не имеет фигурные скобки, но две строки кода. – kinghfb

+0

Как выглядит ваш csv? – veelen

+0

@veelen Я добавил CSV-информацию –

ответ

0

Редактировать: Новый ответ.

Таким образом, есть несколько запутанным решение, которое делает это:

  • принимает данные CSV
  • Объединить числовые данные ключа с использованием всех имеющихся заголовков, давая вам массив ключ => значение
  • Intersect это с Разрешенными заголовками
  • Добавить это в конечном массив данных
  • удаляет строку заголовка

Там мы идем. Это ужасно читать, но, похоже, все в порядке. Поскольку все манипуляции с массивами основаны на C, это должно быть быстрее, чем манипулировать тысячами строк в PHP.

$availableHeaders = array('NAME', 'THING', 'EMAIL'); 
    $headers = array('NAME', 'EMAIL'); 
    $theData = array(); 

    if (($handle = fopen($uploadedFile, "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
      $theData[] = array_intersect_key(array_combine(array_values($availableHeaders), array_values($data)), array_flip($headers)); 
     } 
     fclose($handle); 
    } 

    array_shift($theData); // Remove headers 
+0

Заменит ли этот текущий массив '$ theData []'? –

+0

Это добавит только эти два столбца на запись.Тем не менее, я просто проверяю, будет ли fgetcsv назначать ключи или числовые индексы. У меня есть подозрительное подозрение, что это просто числовые индексы пользователей ... – kinghfb

+0

Текущая проблема заключается в том, что чем больше столбцов я добавляю, тем больше массивов добавляется. 1 столбец = 1 массив, 2 столбца 2 массива (как мой вопрос) 3 столбца 3 массива и т. Д. И т. Д. –

0

Пример .csv:

IGNORE1,NAME,EMAIL,IGNORE2,IGNORE3 
-1,John Doe,[email protected],-1,-1 
-1,Jane Doe,[email protected],-1,-1 

Код:

$headers = array('3' => 'NAME', '4' => 'EMAIL'); 
$theData = array(); 
$isFirstRow = true; 
$rowsToKeep = array(); 
if (($handle = fopen($uploadedFile, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     if ($isFirstRow) { 
      $rowsToKeep = array_intersect($data, $headers); 
      $theData[] = $rowsToKeep; 
      $isFirstRow = false; 
     } else {  
      $theData[] = array_intersect_key($data, $rowsToKeep); 
     } 
    } 
    fclose($handle); 
} 

Производит:

Array 
(
    [0] => Array 
     (
      [1] => NAME 
      [2] => EMAIL 
     ) 

    [1] => Array 
     (
      [1] => John Doe 
      [2] => [email protected] 
     ) 

    [2] => Array 
     (
      [1] => Jane Doe 
      [2] => [email protected] 
     ) 

) 
+0

Что произойдет, если столбцы находятся в другом порядке? Именно поэтому я основывался на имени столбца, а не на том, что было в заголовке. –

+0

В моем ответе есть все, что вам нужно для проверки кода. Он не заботится о том, в каком порядке находятся ваши столбцы. Он использует имена, указанные вами в заголовках $, для определения столбцов, которые должны храниться в $ theData. Я настоятельно рекомендую ознакомиться с функциями http://php.net/manual/en/ref.array.php. – Dave

Смежные вопросы