You are here

function _node_import_csv_get_row in Node import 5

Get one row from the CSV file and return it as an array of columns/fields.

1 string reference to '_node_import_csv_get_row'
_node_import_errors in ./node_import.module

File

./node_import.module, line 797
This modules provides a wizard at "administer >> content >> import" to import a CSV file with nodes.

Code

function _node_import_csv_get_row($filepath, $reset = FALSE) {
  static $handle;
  if ($filepath == '') {
    unset($handle);
    return FALSE;
  }
  if (!isset($handle) || $reset) {
    if (isset($handle)) {
      fclose($handle);
    }
    $handle = fopen($filepath, 'r');
  }

  // return fgetcsv($handle, $size, $separator);
  //
  // fgetcsv() is buggy with special chars at the beginning of fields,
  // let's create our own fgetcsv().
  // Main code taken from http://de.php.net/manual/en/function.fgetcsv.php#75332
  $length = variable_get('node_import_csv_size', 10000);
  $delimiter = variable_get('node_import_csv_separator', ',');
  $qualifier = variable_get('node_import_csv_qualifier', '"');
  $escape = variable_get('node_import_csv_escape', '\\');
  $fields = array();
  $str = '';
  while ($str == '') {

    // Skip empty lines
    if (feof($handle)) {
      return FALSE;
    }
    $str = trim(fgets($handle, $length));
  }
  $multiline = FALSE;
  while (strlen($str) > 0) {
    $str = ltrim($str);
    if ($str[0] == $delimiter && !empty($fields)) {
      $str = ltrim(substr($str, 1));
    }
    if ($str[0] == $qualifier) {
      $inside = TRUE;
      $value = '';
      while ($inside) {
        $newvalue = '';
        for ($i = 1; $i < strlen($str); $i++) {
          if ($str[$i] == $qualifier && $str[$i - 1] != $escape) {
            $str = $multiline ? substr($str, strlen($newvalue) + 2) : substr($str, strlen($value) + 2);
            $value = str_replace($escape . $qualifier, $qualifier, $value);
            $inside = FALSE;
            $multiline = FALSE;
            break;
          }
          $value .= $str[$i];
          if ($multiline) {
            $newvalue .= $str[$i];
          }
        }
        if ($inside) {
          if (feof($handle)) {
            $inside = FALSE;

            // End of file reached.
          }
          else {
            $str = "\n" . fgets($handle, $length);

            // We need to read more data, multiline field.
            $multiline = TRUE;
          }
        }
      }
    }
    else {
      if (strlen($str) > 0) {
        $end = strpos($str, $delimiter);
        $value = $end !== false ? substr($str, 0, $end) : $str;
        $str = substr($str, strlen($value));
      }
      else {
        break;
      }
    }
    $fields[] = $value;
  }
  return $fields;
}