ホームページ  >  記事  >  バックエンド開発  >  大きな CSV ファイルを 1 行ずつ素早く読み取るための PHP カプセル化クラス共有 (他の非常に大きなテキスト ファイルにも適用可能)_PHP チュートリアル

大きな CSV ファイルを 1 行ずつ素早く読み取るための PHP カプセル化クラス共有 (他の非常に大きなテキスト ファイルにも適用可能)_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:34:18704ブラウズ

大きな CSV ファイルの読み取りについては以前に説明しました (PHP で大きな CSV ファイルを 1 行ずつ読み取り、処理するコード例) が、大きなファイルを迅速かつ完全に操作する方法にはまだいくつかの問題があります。

1. 大きな CSV ファイルの合計行数をすばやく取得するにはどうすればよいですか?

方法 1: ファイルの内容を直接取得し、改行文字を使用して分割して合計行数を取得します。この方法は小さなファイルには実行可能ですが、大きなファイルを処理する場合には実行できません。 line を使用して合計行数を取得します。この方法は方法 1 よりも優れていますが、大きなファイルの場合はタイムアウトになる可能性があります。
方法 3: SplFileObject クラスを使用して、ファイルの末尾にポインターを直接配置します。 SplFileObject::key メソッドを通じて総行数を取得するこの方法は実行可能であり、効率的です。

具体的な実装方法:


コードをコピー コードは次のとおりです:
$csv_file = 'path/bigfile.csv';
$spl_object = new SplFileObject($csv_file, 'rb');
$spl_object-> ;seek(filesize($csv_file));
echo $spl_object->key();


2. 大きな CSV ファイルからデータをすばやく取得するにはどうすればよいですか? 引き続き PHP の SplFileObject クラスを使用して、seek メソッドによる素早い位置決めを実現します。


コードをコピーします コードは次のとおりです:
$csv_file = 'path/bigfile.csv';
$start = 100000; // 100000行目から読み取りを開始します
$num = 100; 100 行を読み取ります
$data = array();
$spl_object = new SplFileObject($csv_file, 'rb');
$spl_object->seek($start);
while ($num-- && !$spl_object- > ;eof()) {
$data[] = $spl_object->fgetcsv();
$spl_object->next();
}
print_r($data);


3. 上記の 2 つの点に基づいて、csv ファイルを読み取るためのクラスに編成します。


コードをコピーします。 コードは次のとおりです。 class CsvReader { private $csv_file;
private $spl_object = null;
private $error;

public function __construct($csv_file = '') {
if($csv_file && file_exists($csv_file)) {
$this->csv_file = $csv_file;
}
}

public function set_csv_file ($csv_file) {
if(!$csv_file || !file_exists($csv_file)) {
$this->error = 'ファイルが無効です';
return false;
}
$this- >csv_file = $csv_file ;
$this->spl_object = null;
}

パブリック関数 get_csv_file() {
return $this->csv_file;
}

プライベート関数 _file_valid($file = '') {
$file = $file ? $file : $this->csv_file;
if(!$file || !file_exists($file)) {
return false;
}
if(!is_readable($file)) {
return false;
}
return true;
}

プライベート関数 _open_file() {
if(!$this->_file_valid()) {
$this->error = 'ファイルが無効です';
return false;
}
if ($this->spl_object == null) {
$this->spl_object = new SplFileObject($this->csv_file, 'rb');
}
return true;
}

public function get_data($length = 0, $start = 0) {
if(!$this->_open_file()) {
return false; }

$length = $length : $this-> ? ;get_lines();
$start = $start - 1;
$start = ($start $data = array();
$this->spl_object->seek ($start);
while ($length-- && !$this->spl_object->eof()) {
$data[] = $this->spl_object->fgetcsv();
$this ->spl_object->next();
}
return $data;
}

public function get_lines() {
if(!$this->_open_file()) {
return false;
}
$ this->spl_object->seek(filesize($this->csv_file));
return $this->spl_object->key();
}

public function get_error() {
return $this ->error;
}
}


呼び出しメソッドは次のとおりです:



コードをコピーします
コードは次のとおりです:

include('CsvReader.class.php');

$csv_file = 'パス/bigfile.csv';

$csvreader = 新しい CsvReader($csv_file);

$line_number = $csvreader->get_lines();

$data = $csvreader->get_data(10);

エコー $line_number, chr(10);

print_r($data);


実際、上記の CsvReader クラスは CSV の大きなファイルだけでなく、クラス内の fgetcsv メソッドが現在のものに少し変更されていれば、大きなファイルや他のテキスト タイプの非常に大きなファイルにも使用できます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/751935.html技術記事大きな CSV ファイルの読み取りについては以前に説明しました (PHP で大きな CSV ファイルを 1 行ずつ読み取り、処理するコード例) が、大きなファイルを迅速かつ完全に操作する方法にはまだいくつかの問題があります。 ...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。