private function setPrologColumns() { if (empty( $this->prolog['meta_column'] )) { //set the prolog columns $this->prolog['meta_column'] = $this->reader->getColumnHeaders()[0]; $this->prolog['key_column'] = $this->mapping->getMappings()[$this->reader->getColumnHeaders()[1]]; $this->prolog['value_column'] = $this->mapping->getMappings()[$this->reader->getColumnHeaders()[2]]; } }
/** * @param \SplFileObject $file * @param array $data * @return array */ public function getCsvHeader(\SplFileObject $file, &$data) { $csvReader = new CsvReader($file, $data['delimiter']); $csvReader->setHeaderRowNumber(0, 1); $csvReader->setStrict(false); $data['count'] = $csvReader->count(); $data['header'] = $csvReader->getColumnHeaders(); if ($csvReader->hasErrors() || count($csvReader->getFields()) <= 1) { $this->setError('error read file'); } else { $row = $csvReader->getRow(1); foreach ($row as $key => $value) { $data['first'][$key] = $value; } } return $data; }
public function load() { $reader = new CsvReader($this->getFile(), $this->getOption('delimiter'), $this->getOption('enclosure'), $this->getOption('escape')); $headers = $this->getOption('headers'); $headerRow = $this->getOption('header_row'); if (false !== $headerRow) { $duplicateHeaders = $headers == 'merge' ? CsvReader::DUPLICATE_HEADERS_MERGE : CsvReader::DUPLICATE_HEADERS_INCREMENT; $reader->setHeaderRowNumber($headerRow, $duplicateHeaders); } if (is_array($headers)) { $reader->setColumnHeaders($headers); } elseif ('number' == $headers) { $headers = []; for ($i = 1; $i <= count($reader->getColumnHeaders()); ++$i) { $headers[] = 'field' . $i; } $reader->setColumnHeaders($headers); } $reader->setStrict($this->getOption('strict')); return $this->setReader($reader); }
/** * ImportProcess action * * @param $request * @return Response * * @throws AccessDeniedException If access is not granted */ public function importProcessAction(Request $request) { if (false === $this->admin->isGranted('IMPORT')) { throw new AccessDeniedException(); } $file = new \SplFileObject('/tmp/import/product_import.csv'); // this must be done to import CSVs where one of the data-field has CRs within! $file->setFlags(\SplFileObject::READ_CSV | \SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD); $reader = new Reader\CsvReader($file, ';'); $reader->setHeaderRowNumber(0); $choices = array(null => 'Nicht importieren', 'id' => 'Id', 'productNumber' => 'Artikelnummer', 'productCategory' => 'Artikelkategorie', 'translations.name' => 'Name', 'translations.description' => 'Beschreibung', 'memo' => 'Memo', 'enabled' => 'Aktiv', 'basePrice' => 'Basispreis', 'unitOfQuantity' => 'Mengeneinheit'); $defaultData = array(); $builder = $this->createFormBuilder($defaultData); $builder->add('language', ChoiceType::class, array('choices' => array('de' => 'Deutsch', 'en' => 'Englisch', 'fr' => 'Franzoesisch', 'it' => 'Italienisch'))); $builder->add('onlyUpdate', CheckboxType::class, array('label' => 'Nur Update, keine neuen Saetze importieren', 'required' => false)); $headers = array(); foreach ($reader->getColumnHeaders() as $header) { preg_match_all('/\\((.*?)\\)/', $header, $out); $header = $out[1] ? $out[1][0] : $header; $headers[] = $header; $builder->add($header, 'choice', array('required' => false, 'label' => false, 'choices' => $choices)); } $form = $builder->getForm(); $form->handleRequest($request); $data = array(); foreach ($reader as $row) { $data[] = $row; } $mapping = null; if ($form->isValid()) { if ($request->request->has('btn_confirm')) { $formData = $form->getData(); // Set Database into "nonchecking Foreign Keys" $em = $this->getDoctrine()->getManager(); $em->getConnection()->exec("SET FOREIGN_KEY_CHECKS=0;"); $writer = new DoctrineWriter($em, "AppBundle:Product", array('productNumber'), $formData['language']); $writer->setTruncate(false); $metadata = $em->getClassMetaData("AppBundle:Product"); $metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_NONE); // ************************************** // Excel Verwurschtelt die Artikelnummer. // ************************************** $filter = new Step\ConverterStep(); $filter->add(function ($v) { unset($v['--NONE--']); if (array_key_exists('id', $v)) { $v['id'] = intval($v['id']); } return $v; }); $filter->add(function ($v) { if (array_key_exists('basePrice', $v)) { $v['basePrice'] = intval($v['basePrice']); } return $v; }); $filter->add(function ($v) { if (!array_key_exists('enabled', $v)) { $v['enabled'] = true; } return $v; }); $mapping = new Step\MappingStep(); foreach ($headers as $header) { $newMap = $formData[$header] ? $formData[$header] : '--NONE--'; $mapping->map('[' . $header . ']', '[' . $newMap . ']'); } $converter = new Step\ValueConverterStep(); $converter->add('[productCategory]', function ($id) { $repository = $this->getDoctrine()->getRepository('AppBundle:ProductCategory'); $category = $repository->findOneById($id); return $category; }); $converter->add('[unitOfQuantity]', function ($id) { $repository = $this->getDoctrine()->getRepository('AppBundle:UnitOfQuantity'); $uoq = $repository->findOneById($id); return $uoq; }); $workflow = new Workflow\StepAggregator($reader); $workflow->addStep($mapping); $workflow->addStep($filter); $workflow->addStep($converter); $workflow->addWriter($writer); $workflow->process(); // Resetting Database Check Status $em->getConnection()->exec("SET FOREIGN_KEY_CHECKS=1;"); return $this->render('CRUD/import_product_category_finish.html.twig', array('action' => 'import')); } } $formView = $form->createView(); // set the theme for the current Admin Form $this->get('twig')->getExtension('form')->renderer->setTheme($formView, $this->admin->getFilterTheme()); return $this->render('CRUD/import_product_category_process.html.twig', array('action' => 'import', 'form' => $formView, 'data' => $data, 'headers' => $headers)); }
public function testReadCsvFileWithoutColumnHeaders() { $file = new \SplFileObject(__DIR__ . '/../Fixtures/data_no_column_headers.csv'); $csvReader = new CsvReader($file); $this->assertEmpty($csvReader->getColumnHeaders()); }
private function formatToReader(Format $format, \SplFileInfo $file) { if ($format instanceof CsvFormat) { $reader = new CsvReader($file->openFile(), $format->getDelimiter(), $format->getEnclosure(), $format->getEscape()); $reader->setStrict(false); if ($format->isHeaderInFirstRow()) { $reader->setHeaderRowNumber(0, CsvReader::DUPLICATE_HEADERS_MERGE); $reader->setColumnHeaders(array_map('trim', $reader->getColumnHeaders())); //TODO some header-collaborator? } } elseif ($format instanceof ExcelFormat) { $headerRowNumber = $format->isHeaderInFirstRow() ? 0 : null; $reader = new ExcelReader($file->openFile(), $headerRowNumber, $format->getActivesheet()); if ($format->isHeaderInFirstRow()) { $reader->setColumnHeaders(array_map('trim', $reader->getColumnHeaders())); //TODO some header-collaborator? } } elseif ($format instanceof JsonFormat) { $array = json_decode(file_get_contents($file), true); $reader = new ArrayReader($array); } elseif ($format instanceof XmlFormat) { $reader = new XmlReader($file->openFile(), $format->getXpath()); } elseif ($format instanceof CompressedFormat && $format->getSubFormat()) { $reader = $this->formatToReader($format->getSubFormat(), $format->getInsideStream($file)); } else { throw new InvalidConfigurationException('Cannot build reader. Unknown format: ' . $format); } return $reader; }