之前已经描述过读取CSV大型文件。(PHP在线读取和处理大型CSV文件),但如何快速而完整地操作大型文件还存在一些问题。

1。如何快速获取CSV大文件的总数

方法1:直接获取文件的内容,使用行字符分割总行数,这种方法对于小文件是可行的,处理大文件是不可行的。
方法二:用一行一行通过fgets得到总的行数,该方法比的方法,但大文件仍有加班的可能性。
方法三:用splfileobject类的帮助,指针直接定位到文件末尾,并得到行splfileobject总数::关键方法。这种方法是可行的和有效的。

具体实现方法:
复制代码代码如下所示:
csv_file美元= 'path /文件.csv;
spl_object =新splfileobject美元(美元csv_file,'rb);
spl_object美元->寻求(文件大小($ csv_file));
echo $ spl_object ->关键();

2。如何快速获取CSV大文件的数据

PHP的splfileobject类仍被使用,快速定位是通过寻求方法实现。
复制代码代码如下所示:
csv_file美元= 'path /文件.csv;
$第十万= 100000;从行的开头读取
$ = 100;读取100行
$ =数组();
spl_object =新splfileobject美元(美元csv_file,'rb);
spl_object ->寻求美元(美元开始);
而(元)!spl_object美元-> EOF()){
{ } =美元美元的数据spl_object -> fgetcsv();
spl_object美元->下();
}
print_r($数据);


三.结合以上两点,整理成一类CSV文件读取:
复制代码代码如下所示:
类CsvReader {
私人csv_file美元;
私人spl_object美元= null;
私人$错误;

公共功能__construct($ csv_file =){
如果(csv_file file_exists美元(美元csv_file)){
美元-> csv_file = $ csv_file;
}
}

公共功能set_csv_file($ csv_file){
如果($ csv_file | |!!file_exists($ csv_file)){
美元->错误=文件无效;
返回false;
}
美元-> csv_file = $ csv_file;
美元-> spl_object = null;
}

公共功能get_csv_file(){
返回csv_file美元->;
}

私有函数_file_valid($文件=){
文件大小=文件文件:美元-> csv_file;
如果(文件| |!!file_exists(文件)){
返回false;
}
如果(!is_readable(文件)){
返回false;
}
返回true;
}

私有函数_open_file(){
如果(!美元-> _file_valid()){
美元->错误=文件无效;
返回false;
}
如果(美元-> spl_object = = null){
美元-> spl_object =新splfileobject(美元-> csv_file,'rb);
}
返回true;
}

公共功能get_data(长度= 0美元美元,开始= 0){
如果(!美元-> _open_file()){
返回false;
}
长度=美元美元美元美元长度长度:-> get_lines();
$开始= $ - 1;
$ =($开始0)0:$开始;
$ =数组();
这spl_object美元-> ->寻求($开始);
而(长度)!这spl_object美元-> -> EOF()){
{ } =数据美元美元-> spl_object -> fgetcsv();
这spl_object美元-> ->下();
}
返回$数据;
}

公共功能get_lines(){
如果(!美元-> _open_file()){
返回false;
}
这spl_object美元-> ->寻求(文件大小(美元-> csv_file));
返回spl_object美元-> ->关键();
}

公共功能get_error(){
返回$此错误;
}
}
调用的方法如下所示:
复制代码代码如下所示:
包括('csvreader。类。php);

csv_file美元= 'path /文件.csv;

$ CsvReader =新CsvReader($ csv_file);

line_number美元=美元CsvReader -> get_lines();

美元美元数据= CsvReader -> get_data(10);



echo $ line_number,CHR(10);

print_r($数据);


事实上,上述CsvReader类不仅是CSV文件过大,同时也为其他文本类型的大文件或超文件。前提是改变fgetcsv方法当前类。