[PHP] Goodby CSV를 사용하여 효율적으로 CSV 제거

11629 단어 PHPgoodbycsv

Goodby CSV 소개


CSV 가져오기/내보내기에 사용되는 PHP 라이브러리로서 메모리 효율성이 뛰어납니다.
github : Goodby CSV
개인 응용 프로그램 등의 사용에서 많은 메모리 효율을 고려할 필요가 없을 수도 있지만 수백만, 수천만 줄의 대규모 프로젝트에서 CSV 처리는 대량의 메모리를 사용할 것이다.
Goodby CSV에서는 CSV의 모든 줄을 한꺼번에 읽지 않고 호출 함수로 한 줄 한 줄 처리합니다.
또한 SJIS-win, EUC-JP, UTF-8 등을 지원해 사양에 유연하게 대응할 수 있다.

필요조건


· PHP 5.3.2 이상
・mbstring

설치하다.


Composier를 사용하기 때문에 프로젝트 폴더에 composier를 설치합니다.
curl -s http://getcomposer.org/installer | php
프로젝트 디렉터리의 루트에 있습니다.json을 만드는 것은 다음과 같다.
{
    "require": {
        "goodby/csv": "*"
    }
}
설치하다.
php composer.phar install

사용법


config 구성


가져올 때
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.
;
내보낼 때
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
;
구분자, 괄호, 탈출 문자, 문자 코드, 파일 모드 등을 설정할 수 있습니다.

예: PDO를 통해 CSV 데이터를 DB로 가져오기


CSV 가져오기
users.csv
1,tom,[email protected]
2,taro,[email protected]
3,hanako,[email protected]
hoge라는 DB에 users라는 책상이 있다고 가정해 보세요.
다음 작업을 수행합니다.
CsvImporter.php
use Goodby\CSV\Import\Standard\Lexer;
use Goodby\CSV\Import\Standard\Interpreter;
use Goodby\CSV\Import\Standard\LexerConfig;

require_once("vendor/autoload.php");

//DBの設定(postgreSQLの場合)
$pdo = new PDO('pgsql:host=localhost;dbname=hoge', 'postgres', '');

//configの設定
$config = new LexerConfig();
$lexer = new Lexer($config);

$interpreter = new Interpreter();

$interpreter->addObserver(function(array $columns) use ($pdo) {
    //データに処理を入れるときはこのあたりに
    $stmt = $pdo->prepare('INSERT INTO users (id, name, email) VALUES (?, ?, ?)');
    $stmt->execute($columns);
});

//読み込むCSVファイル
$lexer->parse('users.csv', $interpreter);
이렇게

예: PDO의 DB에서 CSV로 데이터 내보내기


다음 작업을 수행합니다.
CsvExporter.php
use Goodby\CSV\Export\Standard\Exporter;
use Goodby\CSV\Export\Standard\ExporterConfig;
use Goodby\CSV\Export\Standard\CsvFileObject;
use Goodby\CSV\Export\Standard\Collection\PdoCollection;
use Goodby\CSV\Export\Standard\Collection\CallbackCollection;

require_once("vendor/autoload.php");

//DBの設定(postgreSQLの場合)
$pdo = new PDO('pgsql:host=localhost;dbname=hoge', 'postgres', '');

$stmt = $pdo->prepare("SELECT * FROM users");
$stmt->execute();

$collection = new CallbackCollection(new PdoCollection($stmt), function($row) {
    //ここにデータの処理など
    $row['name'] = strtoupper($row['name']);

    return $row;
});

//configの設定 SJISで出力する
$config = new ExporterConfig();
$config->setToCharset('SJIS-win');

//エクスポート
$exporter = new Exporter($config);
$exporter->export('users_converted.csv', $collection);
다음 CSV를 내보냅니다.
users_converted.csv
1,TOM,[email protected]
2,TARO,[email protected]
3,HANAKO,[email protected]

총결산


사용법이 간단하다.
줄 수가 상당히 많은 CSV를 처리할 때 메모리 효율을 높일 수 있습니다.
프로젝트에서 실제로 사용됩니다.
메모리 사용량 비교는 나중에 시간 나면 해보세요.

좋은 웹페이지 즐겨찾기