Goodby CSV is a high memory efficient flexible and extendable open-source CSV import/export library.
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
$lexer = new Lexer(new LexerConfig());
$interpreter = new Interpreter();
$interpreter->addObserver(function(array $row) {
// do something here.
// for example, insert $row to database.
});
$lexer->parse('data.csv', $interpreter);
This library designed for memory unbreakable. It will not be accumulated in the memory whole rows. The importer read CSV file and execute callback function line by line.
This library supports mulitbyte input/output: for example, SJIS-win, EUC-JP and UTF-8.
Goodby CSV is fully unit-tested. The library is stable and ready to be used in large projects like enterprise applications.
- PHP 5.3.2 or later
- mbstring
Install composer in your project:
curl -s http://getcomposer.org/installer | php
Create a composer.json
file in your project root:
{
"require": {
"goodby/csv": "*"
}
}
Install via composer:
php composer.phar install
Import configuration:
use Goodby\CSV\Import\Standard\LexerConfig;
$config = new LexerConfig();
$config
->setDelimiter("\t") // Customize delimiter. Default value is comma(,)
->setEnclosure("'") // Customize enclosure. Default value is double quotation(")
->setEscape("\\") // Customize escape character. Default value is backslash(\)
->setToCharset('UTF-8') // Customize target encoding. Default value is null, no converting.
->setFromCharset('SJIS-win') // Customize CSV file encoding. Default value is null.
;
Export configuration:
use Goodby\CSV\Export\Standard\ExporterConfig;
$config = new ExporterConfig();
$config
->setDelimiter("\t") // Customize delimiter. Default value is comma(,)
->setEnclosure("'") // Customize enclosure. Default value is double quotation(")
->setEscape("\\") // Customize escape character. Default value is backslash(\)
->setToCharset('SJIS-win') // Customize file encoding. Default value is null, no converting.
->setFromCharset('UTF-8') // Customize source encoding. Default value is null.
->setFileMode(CsvFileObject::FILE_MODE_WRITE) // Customize file mode and choose either write or append. Default value is write ('w'). See fopen() php docs
;
As default, Goodby CSV throws StrictViolationException
when it meet with a row which column count is different from the other columns. In the case you want to import such a CSV, you can call Interpreter::unstrict()
to disable row consistency check at importing process
rough.csv:
foo,bar,baz
foo,bar
foo
foo,bar,baz
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\LexerConfig;
$interpreter = new Interpreter();
$interpreter->unstrict(); // Ignore row column count consistency
$lexer = new Lexer(new LexerConfig());
$lexer->parse('rough.csv', $interpreter);
user.csv:
1,alice,alice@example.com
2,bob,bob@example.com
3,carol,carol@eample.com
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
$pdo->query('CREATE TABLE IF NOT EXISTS user (id INT, `name` VARCHAR(255), email VARCHAR(255))');
$config = new LexerConfig();
$lexer = new Lexer($config);
$interpreter = new Interpreter();
$interpreter->addObserver(function(array $columns) use ($pdo) {
$stmt = $pdo->prepare('INSERT INTO user (id, name, email) VALUES (?, ?, ?)');
$stmt->execute($columns);
});
$lexer->parse('user.csv', $interpreter);
temperature.tsv:
9 Tokyo
27 Singapore
-5 Seoul
7 Shanghai
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;
$temperature = array();
$config = new LexerConfig();
$config->setDelimiter("\t");
$lexer = new Lexer($config);
$interpreter = new Interpreter();
$interpreter->addObserver(function(array $row) use (&$temperature) {
$temperature[] = array(
'temperature' => $row[0],
'city' => $row[1],
);
});
$lexer->parse('temperature.tsv', $interpreter);
print_r($temperature);
use Goodby\CSV\Export\Standard\Exporter;
use Goodby\CSV\Export\Standard\ExporterConfig;
$config = new ExporterConfig();
$exporter = new Exporter($config);
$exporter->export('php://output', array(
array('1', 'alice', 'alice@example.com'),
array('2', 'bob', 'bob@example.com'),
array('3', 'carol', 'carol@example.com'),
));
use Goodby\CSV\Export\Standard\Exporter;
use Goodby\CSV\Export\Standard\ExporterConfig;
use Goodby\CSV\Export\Standard\Collection\PdoCollection;
$pdo = new PDO('mysql:host=localhost;dbname=test', 'root', 'root');
$pdo->query('CREATE TABLE IF NOT EXISTS user (id INT, `name` VARCHAR(255), email VARCHAR(255))');
$pdo->query("INSERT INTO user VALUES(1, 'alice', 'alice@example.com')");
$pdo->query("INSERT INTO user VALUES(2, 'bob', 'bob@example.com')");
$pdo->query("INSERT INTO user VALUES(3, 'carol', 'carol@example.com')");
$config = new ExporterConfig();
$exporter = new Exporter($config);
$stmt = $pdo->prepare("SELECT * FROM user");
$stmt->execute();
$exporter->export('php://output', new PdoCollection($stmt));
use Goodby\CSV\Export\Standard\Exporter;
use Goodby\CSV\Export\Standard\ExporterConfig;
use Goodby\CSV\Export\Standard\Collection\CallbackCollection;
$data = array();
$data[] = array('user', 'name1');
$data[] = array('user', 'name2');
$data[] = array('user', 'name3');
$collection = new CallbackCollection($data, function($row) {
// apply custom format to the row
$row[1] = $row[1] . '!';
return $row;
});
$config = new ExporterConfig();
$exporter = new Exporter($config);
$exporter->export('php://stdout', $collection);
namespace AcmeBundle\ExampleBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\StreamedResponse;
class DefaultController extends Controller
{
public function csvExportAction()
{
$conn = $this->get('database_connection');
$stmt = $conn->prepare('SELECT * FROM somewhere');
$stmt->execute();
$response = new StreamedResponse();
$response->setStatusCode(200);
$response->headers->set('Content-Type', 'text/csv');
$response->setCallback(function() use($stmt) {
$config = new ExporterConfig();
$exporter = new Exporter($config);
$exporter->export('php://output', new PdoCollection($stmt->getIterator()));
});
$response->send();
return $response;
}
}
Csv is open-sourced software licensed under the MIT License - see the LICENSE file for details
We works under test driven development.
Checkout master source code from github:
hub clone goodby/csv
Install components via composer:
# If you don't have composer.phar
./scripts/bundle-devtools.sh .
# If you have composer.phar
composer.phar install --dev
Run phpunit:
./vendor/bin/phpunit
editing...