1. Go to this page and download the library: Download ivbre/data-import library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ivbre / data-import example snippets
use Ddeboer\DataImport\Workflow;
use Ddeboer\DataImport\Reader;
use Ddeboer\DataImport\Writer;
use Ddeboer\DataImport\Filter;
$reader = new Reader\...;
$workflow = new Workflow($reader, $logger);
$result = $workflow
->addWriter(new Writer\...())
->addWriter(new Writer\...())
->addFilter(new Filter\CallbackFilter(...))
->setSkipItemOnFailure(true)
->process()
;
//the name of the import - which is an optional 3rd parameter to
//the Workflow class. Returns null by default.
public function getName();
//DateTime instance created at the start of the import.
public function getStartTime();
//DateTime instance created at the end of the import.
public function getEndTime();
//DateInterval instance. Diff off the start + end times.
public function getElapsed();
//Count of exceptions which caught by the Workflow.
public function getErrorCount();
//Count of processed items minus the count of exceptions caught.
public function getSuccessCount();
//Count of items processed
//This will not
$workflow = new Workflow($reader);
use Ddeboer\DataImport\Reader\CsvReader;
$file = new \SplFileObject('/path/to/csv_file.csv');
$reader = new CsvReader($file);
$reader = new CsvReader($file, ';');
foreach ($reader as $row) {
// $row will be an array containing the comma-separated elements of the line:
// array(
// 0 => 'James',
// 1 => 'Bond'
// etc...
// )
}
$reader->setHeaderRowNumber(0);
foreach ($reader as $row) {
// $row will now be an associative array:
// array(
// 'firstName' => 'James',
// 'lastName' => 'Bond'
// etc...
// )
}
use Ddeboer\DataImport\Reader\DbalReader;
$reader = new DbalReader(
$connection, // Instance of \Doctrine\DBAL\Connection
'SELECT u.id, u.username, g.name FROM `user` u INNER JOIN groups g ON u.group_id = g.id'
);
use Ddeboer\DataImport\Reader\DoctrineReader;
$reader = new DoctrineReader($entityManager, 'Your\Namespace\Entity\User');
use Ddeboer\DataImport\Reader\ExcelReader;
$file = new \SplFileObject('path/to/excel_file.xls');
$reader = new ExcelReader($file);
$reader = new ExcelReader($file, 2);
$reader = new ExcelReader($file, null, 3);
$orderFile = new \SplFileObject("orders.csv");
$orderReader = new CsvReader($file, $orderFile);
$orderReader->setHeaderRowNumber(0);
$orderItemFile = new \SplFileObject("order_items.csv");
$orderItemReader = new CsvReader($file, $orderFile);
$orderItemReader->setHeaderRowNumber(0);
$oneToManyReader = new OneToManyReader($orderReader, $orderItemReader, 'items', 'OrderId', 'OrderId');
use Ddeboer\DataImport\Writer\CsvWriter;
$writer = new CsvWriter();
$writer->setStream(fopen('output.csv', 'w'));
// Write column headers:
$writer->writeItem(array('first', 'last'));
$writer
->writeItem(array('James', 'Bond'))
->writeItem(array('Auric', 'Goldfinger'))
->finish();
use Ddeboer\DataImport\Writer\DoctrineWriter;
$writer = new DoctrineWriter($entityManager, 'YourNamespace:Employee');
$writer
->prepare()
->writeItem(
array(
'first' => 'James',
'last' => 'Bond'
)
)
->finish();
$writer = new DoctrineWriter($entityManager, 'YourNamespace:Employee', 'columnName');
$writer = new DoctrineWriter($entityManager, 'YourNamespace:Employee', array('column1', 'column2', 'column3'));
use Ddeboer\DataImport\Writer\PdoWriter;
$pdo = new \PDO('sqlite::memory:');
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$writer = new PdoWriter($pdo, 'my_table');
use Ddeboer\DataImport\Writer\ExcelWriter;
$file = new \SplFileObject('data.xlsx', 'w');
$writer = new ExcelWriter($file);
$writer
->prepare()
->writeItem(array('first', 'last'))
->writeItem(array('first' => 'James', 'last' => 'Bond'))
->finish();
$writer = new ExcelWriter($file, 'My sheet');
$file = new \SplFileObject('data.xlsx', 'a'); // Open file with append mode
$writer = new ExcelWriter($file, 'New sheet');
$writer = new ExcelWriter($file, 'Old sheet');
use Ddeboer\DataImport\Reader;
use Ddeboer\DataImport\Writer\ConsoleTableWriter;
use Symfony\Component\Console\Output\ConsoleOutput;
use Symfony\Component\Console\Helper\Table;
$reader = new Reader\...;
$output = new ConsoleOutput(...);
$table = new Table($output);
// Make some manipulations, e.g. set table style
$table->setStyle('compact');
$workflow = new Workflow($reader);
$workflow->addWriter(new ConsoleTableWriter($output, $table));
use Ddeboer\DataImport\Writer\ConsoleProgressWriter;
use Symfony\Component\Console\Output\ConsoleOutput;
$output = new ConsoleOutput(...);
$progressWriter = new ConsoleProgressWriter($output, $reader);
// Most useful when added to a workflow
$workflow->addWriter($progressWriter);
$output = new ConsoleOutput(...);
$progressWriter = new ConsoleProgressWriter($output, $reader, 'debug', 100);
$output = new ConsoleOutput(...);
$progressWriter = new ConsoleProgressWriter($output, $reader, 'normal', 100);
use Ddeboer\DataImport\Writer\CallbackWriter;
$workflow->addWriter(new CallbackWriter(function ($row) use ($storage) {
$storage->store($row);
}));
use Ddeboer\DataImport\Writer\AbstractStreamWriter;
class MyStreamWriter extends AbstractStreamWriter
{
public function writeItem(array $item)
{
fputs($this->getStream(), implode(',', $item));
}
}
$writer = new MyStreamWriter(fopen('php://temp', 'r+'));
$writer->setCloseStreamOnFinish(false);
$workflow->addWriter(new MyStreamWriter());
$workflow->process();
$stream = $writer->getStream();
rewind($stream);
echo stream_get_contents($stream);
use Ddeboer\DataImport\Writer\StreamMergeWriter;
$writer = new StreamMergeWriter();
$writer->addWriter('first writer', new MyStreamWriter());
$writer->addWriter('second writer', new MyStreamWriter());
use Ddeboer\DataImport\Filter\CallbackFilter;
// Don’t import The Beatles
$filter = new CallbackFilter(function ($data) {
return ('The Beatles' != $data['name']);
});
$workflow->addFilter($filter);
use Ddeboer\DataImport\Filter\OffsetFilter;
// Default implementation is to start from the beginning without maximum count
$filter = new OffsetFilter(0, null);
$filter = new OffsetFilter(); // You can omit both parameters
// Start from the third item, process to the end
$filter = new OffsetFilter(2, null);
$filter = new OffsetFilter(2); // You can omit the second parameter
// Start from the first item, process max three items
$filter = new OffsetFilter(0, 3);
// Start from the third item, process max five items (items 3 - 7)
$filter = new OffsetFilter(2, 5);
use Ddeboer\DataImport\Filter\DateTimeThresholdFilter;
use Ddeboer\DataImport\ValueConverter\DateTimeValueConverter;
new DateTimeThresholdFilter(
new DateTimeValueConverter(),
new \DateTime('yesterday')
);
use Ddeboer\DataImport\Filter\ValidatorFilter;
$filter = new ValidatorFilter($validator);
$filter->add('email', new Assert\Email());
$filter->add('sku', new Assert\NotBlank());
use Ddeboer\DataImport\ItemConverter\ItemConverterInterface;
class MyItemConverter implements ItemConverterInterface
{
public function convert($item)
{
// Do your conversion and return updated $item
return $changedItem;
}
}
use Ddeboer\DataImport\ItemConverter\CallbackItemConverter;
// Use a fictional $translator service to translate each value
$converter = new CallbackItemConverter(function ($item) use ($translator) {
foreach ($item as $key => $value) {
$item[$key] = $translator->translate($value);
}
return $item;
});
use Ddeboer\DataImport\ValueConverter\DateTimeValueConverter;
$converter = new DateTimeValueConverter('d/m/Y H:i:s');
$workflow->addValueConverter('my_date_field', $converter);
use Ddeboer\DataImport\ValueConverter\DateTimeValueConverter;
$converter = new DateTimeValueConverter();
$workflow->addValueConverter('my_date_field', $converter);
use Ddeboer\DataImport\ValueConverter\DateTimeValueConverter;
$converter = new DateTimeValueConverter('d/m/Y H:i:s', 'd-M-Y');
$workflow->addValueConverter('my_date_field', $converter);
use Ddeboer\DataImport\ValueConverter\DateTimeValueConverter;
$converter = new DateTimeValueConverter(null, 'd-M-Y');
$workflow->addValueConverter('my_date_field', $converter);
use Ddeboer\DataImport\ValueConverter\DateTimeToStringValueConverter;
$converter = new DateTimeToStringValueConverter;
$converter->convert(\DateTime('2010-01-01 01:00:00')); //will return string '2010-01-01 01:00:00'
use Ddeboer\DataImport\ValueConverter\ObjectConverter;
class SecretAgent
{
public function __toString()
{
return '007';
}
}
$converter = new ObjectConverter();
$string = $converter->convert(new SecretAgent()); // $string will be '007'
class Villain
{
public function getName()
{
return 'Bad Guy';
}
}
class Organization
{
public function getVillain()
{
return new Villain();
}
}
use Ddeboer\DataImport\ValueConverter\ObjectConverter;
$converter = new ObjectConverter('villain.name');
$string = $converter->convert(new Organization()); // $string will be 'Bad Guy'
use Ddeboer\DataImport\ValueConverter\StringToObjectConverter;
$converter = new StringToObjectConverter($repository, 'name');
$workflow->addValueConverter('input_name', $converter);
use Ddeboer\DataImport\ValueConverter\CallbackValueConverter;
$callable = function ($item) {
return implode(',', $item);
};
$converter = new CallbackValueConverter($callable);
$output = $converter->convert(array('foo', 'bar')); // $output will be "foo,bar"
use Ddeboer\DataImport\ValueConverter\MappingValueConverter;
$converter = new MappingValueConverter(array(
'source' => 'destination'
));
$converter->convert('source'); // destination
$converter->convert('unexpected value'); // throws an UnexpectedValueException
namespace MyApp;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
*/
class Event
{
/**
* @ORM\Column()
*/
protected $event;
/**
* @ORM\Column(type="datetime")
*/
protected $beginDate;
/**
* @ORM\Column(type="datetime")
*/
protected $endDate;
public function setEvent($event)
{
$this->event = $event;
}
public function setBeginDate($date)
{
$this->beginDate = $date;
}
public function setEndDate($date)
{
$this->endDate = $date;
}
// And some getters
}
use Ddeboer\DataImport\Workflow;
use Ddeboer\DataImport\Reader\CsvReader;
use Ddeboer\DataImport\Writer\DoctrineWriter;
use Ddeboer\DataImport\ValueConverter\StringToDateTimeValueConverter;
// Create and configure the reader
$file = new \SplFileObject('input.csv');
$csvReader = new CsvReader($file);
// Tell the reader that the first row in the CSV file contains column headers
$csvReader->setHeaderRowNumber(0);
// Create the workflow from the reader
$workflow = new Workflow($csvReader);
// Create a writer: you need Doctrine’s EntityManager.
$doctrineWriter = new DoctrineWriter($entityManager, 'MyApp:Event');
$workflow->addWriter($doctrineWriter);
// Add a converter to the workflow that will convert `beginDate` and `endDate`
// to \DateTime objects
$dateTimeConverter = new StringToDateTimeValueConverter('Ymd');
$workflow
->addValueConverter('beginDate', $dateTimeConverter)
->addValueConverter('endDate', $dateTimeConverter);
// Process the workflow
$workflow->process();
use Ddeboer\DataImport\Workflow;
use Ddeboer\DataImport\Reader\ArrayReader;
use Ddeboer\DataImport\Writer\CsvWriter;
use Ddeboer\DataImport\ValueConverter\CallbackValueConverter;
// Your input data
$reader = new ArrayReader(array(
array(
'first', // This is for the CSV header
'last',
array(
'first' => 'james',
'last' => 'Bond'
),
array(
'first' => 'hugo',
'last' => 'Drax'
)
))
);
// Create the workflow from the reader
$workflow = new Workflow($reader);
// Add the writer to the workflow
$file = new \SplFileObject('output.csv', 'w');
$writer = new CsvWriter($file);
$workflow->addWriter($writer);
// As you can see, the first names are not capitalized correctly. Let's fix
// that with a value converter:
$converter = new CallbackValueConverter(function ($input) {
return ucfirst($input);
});
$workflow->addValueConverter('first', $converter);
// Process the workflow
$workflow->process();