/** * @param InputInterface $input * @param OutputInterface $output */ protected function execute(InputInterface $input, OutputInterface $output) { $inputFile = $input->getArgument('input'); $outputFile = $input->getArgument('output'); $inputFormat = substr($inputFile, strrpos($inputFile, '.') + 1); $outputFormat = $outputFile ? substr($outputFile, strrpos($outputFile, '.') + 1) : null; $output->writeln(sprintf('Convert <info>%s</info> into <info>%s</info>', $inputFormat, $outputFormat)); $workflow = new Workflow(); if ($inputFormat === 'csv') { $reader = new CsvReader($inputFile); $outputFormat = $outputFormat ? $outputFormat : 'xlsx'; $outputFile = $outputFile ? $outputFile : str_replace('.csv', '.xlsx', $inputFile); } else { if ($inputFormat === 'xlsx' || $inputFormat === 'xls') { $reader = new ExcelReader(PHPExcel_IOFactory::load($inputFile)); $outputFormat = $outputFormat ? $outputFormat : 'csv'; $outputFile = $outputFile ? $outputFile : str_replace(['.xlsx', '.xls'], '.csv', $inputFile); } else { $output->writeln(sprintf('<error>Invalid input file format %s.</error>', $inputFormat)); return; } } $workflow->addConverter(new HeaderConverter()); $workflow->addFilter(new SkipFirstFilter(1)); if ($outputFormat === 'csv') { $writer = new CsvWriter($outputFile); $writer->autoDetectHeader(); } else { if ($outputFormat === 'xlsx' || $outputFormat == 'xls') { $writer = new ExcelWriter($outputFile); $writer->autoDetectHeader(); } else { $output->writeln(sprintf('<error>Invalid output file format: %s</error>', $outputFormat)); return; } } $workflow->addConverter(new NullConverter()); $workflow->addWriter($writer); $workflow->addWriter(new ConsoleProgressWriter(new ProgressBar($output, $reader->count()))); $result = $workflow->process($reader); $output->writeln(''); $output->writeln(sprintf('Read rows: %d', $result->getReadCount())); $output->writeln(sprintf('Written rows: %d', $result->getItemWriteCount())); $output->writeln(sprintf('Error rows: %d', $result->getErrorCount())); if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) { foreach ($result->getExceptions() as $exception) { $output->writeln(sprintf('- <error>%s</error>', $exception->getMessage())); if ($output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE) { $output->writeln(sprintf('<error>%s</error>', $exception->getTraceAsString())); } } } }
/** * @test * @covers Plum\Plum\Workflow::process() * @covers Plum\Plum\Workflow::processReader() * @covers Plum\Plum\Workflow::processItem() * @covers Plum\Plum\Workflow::prepareWriters() * @covers Plum\Plum\Workflow::finishWriters() * @covers Plum\Plum\Workflow::writeItem() */ public function processShouldReadFromMultipleReaders() { $iterator1 = m::mock('\\Iterator'); $iterator1->shouldReceive('rewind'); $iterator1->shouldReceive('valid')->andReturn(true)->once(); $iterator1->shouldReceive('current')->andReturn('foobar'); $iterator1->shouldReceive('next'); $iterator1->shouldReceive('valid')->andReturn(false)->once(); $reader1 = $this->getMockReader(); $reader1->shouldReceive('getIterator')->andReturn($iterator1); $iterator2 = m::mock('\\Iterator'); $iterator2->shouldReceive('rewind'); $iterator2->shouldReceive('valid')->andReturn(true)->once(); $iterator2->shouldReceive('current')->andReturn('foobar'); $iterator2->shouldReceive('next'); $iterator2->shouldReceive('valid')->andReturn(false)->once(); $reader2 = $this->getMockReader(); $reader2->shouldReceive('getIterator')->andReturn($iterator2); $writer = $this->getMockWriter(); $writer->shouldReceive('prepare')->once(); $writer->shouldReceive('finish')->once(); $writer->shouldReceive('writeItem')->with('foobar')->twice(); $this->workflow->addWriter($writer); $result = $this->workflow->process([$reader1, $reader2]); $this->assertEquals(2, $result->getReadCount()); $this->assertEquals(2, $result->getWriteCount()); $this->assertEquals(2, $result->getItemWriteCount()); }
<?php require_once __DIR__ . '/../vendor/autoload.php'; use Plum\Plum\Writer\ArrayWriter; use Plum\Plum\Workflow; use Plum\Plum\Reader\ArrayReader; use Plum\Plum\Converter\CallbackConverter; use Plum\Plum\Filter\CallbackFilter; $reader = new ArrayReader(['foobar', 'qoobar', 'bazbaz']); $writer1 = new ArrayWriter(); $writer2 = new ArrayWriter(); $workflow = new Workflow(); $workflow->addConverter(new CallbackConverter(function ($item) { return strtoupper($item); })); $workflow->addWriter($writer1); $workflow->addFilter(new CallbackFilter(function ($item) { return $item != 'BAZBAZ'; })); $workflow->addWriter($writer2); $workflow->process($reader); print_r($writer1->getData()); print_r($writer2->getData());
<?php require_once __DIR__ . '/../vendor/autoload.php'; use Plum\Plum\Reader\ArrayReader; use Plum\Plum\Writer\ArrayWriter; use Plum\Plum\Workflow; use Plum\Plum\WorkflowConcatenator; $reader = new ArrayReader(['foo', 'bar', 'baz', 'qoo']); $writer = new ArrayWriter(); $concatenator = new WorkflowConcatenator(); $workflow1 = new Workflow(); $workflow1->addWriter($concatenator); $workflow1->process($reader); $workflow2 = new Workflow(); $workflow2->addWriter($writer); $workflow2->process($concatenator); print_r($writer->getData());