You are here

CSVFileObject.php in Migrate Source CSV 8.2

Same filename and directory in other branches
  1. 8 src/CSVFileObject.php

File

src/CSVFileObject.php
View source
<?php

namespace Drupal\migrate_source_csv;


/**
 * Defines a CSV file object.
 *
 * @package Drupal\migrate_source_csv.
 *
 * Extends SPLFileObject to:
 * - assume CSV format
 * - skip header rows on rewind()
 * - address columns by header row name instead of index.
 */
class CSVFileObject extends \SplFileObject {

  /**
   * The number of rows in the CSV file before the data starts.
   *
   * @var int
   */
  protected $headerRowCount = 0;

  /**
   * The human-readable column headers, keyed by column index in the CSV.
   *
   * @var array
   */
  protected $columnNames = [];

  /**
   * {@inheritdoc}
   */
  public function __construct($file_name) {

    // Necessary to use this approach because SplFileObject doesn't like NULL
    // arguments passed to it.
    call_user_func_array([
      'parent',
      '__construct',
    ], func_get_args());
  }

  /**
   * {@inheritdoc}
   */
  public function rewind() {
    $this
      ->seek($this
      ->getHeaderRowCount());
  }

  /**
   * {@inheritdoc}
   */
  public function current() {
    $row = parent::current();
    if ($row && !empty($this->columnNames)) {

      // Only use columns specified in the defined CSV columns.
      $row = array_intersect_key($row, $this->columnNames);

      // Set meaningful keys for the columns mentioned in $this->csvColumns.
      foreach ($this->columnNames as $key => $value) {

        // Copy value to more descriptive key and unset original.
        $value = key($value);
        $row[$value] = isset($row[$key]) ? $row[$key] : NULL;
        unset($row[$key]);
      }
    }
    return $row;
  }

  /**
   * Return a count of all available source records.
   */
  public function count() {
    return iterator_count($this);
  }

  /**
   * Number of header rows.
   *
   * @return int
   *   Get the number of header rows, zero if no header row.
   */
  public function getHeaderRowCount() {
    return $this->headerRowCount;
  }

  /**
   * Number of header rows.
   *
   * @param int $header_row_count
   *   Set the number of header rows, zero if no header row.
   */
  public function setHeaderRowCount($header_row_count) {
    $this->headerRowCount = $header_row_count;
  }

  /**
   * CSV column names.
   *
   * @return array
   *   Get CSV column names.
   */
  public function getColumnNames() {
    return $this->columnNames;
  }

  /**
   * CSV column names.
   *
   * @param array $column_names
   *   Set CSV column names.
   */
  public function setColumnNames(array $column_names) {
    $this->columnNames = $column_names;
  }

}

Classes

Namesort descending Description
CSVFileObject Defines a CSV file object.