Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将csv文件缩减为两列的最快方法_Php - Fatal编程技术网

Php 将csv文件缩减为两列的最快方法

Php 将csv文件缩减为两列的最快方法,php,Php,我有一个csv文件,其中有30000行。它也有9列。为了加快对所有内容的处理,我希望将文件缩减为所需的两列,并删除其余部分。这就是我所做的 $retardment=1;//17;// 151; //499;// 991;// 1877 if (($handle = fopen($source, "r")) !== FALSE) { $stock_handle = fopen($source_stock, "w+"); $row=0; $col=array();

我有一个csv文件,其中有30000行。它也有9列。为了加快对所有内容的处理,我希望将文件缩减为所需的两列,并删除其余部分。这就是我所做的

$retardment=1;//17;// 151;  //499;//  991;// 1877
if (($handle = fopen($source, "r")) !== FALSE) {
    $stock_handle = fopen($source_stock, "w+"); 
    $row=0;
    $col=array();
    while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) {
            unset($line[1]);
            unset($line[2]);
            unset($line[3]);
            unset($line[4]);
            unset($line[5]);
            unset($line[6]);
            unset($line[8]);
            unset($line[9]);
        if($row%$retardment<1){
            fputcsv($stock_handle, $line);
        }
            unset($line);
        $row++;
    }
    fclose($handle);
    fclose($stock_handle);
}
$delayment=1//17;// 151;  //499;//  991;// 1877
if(($handle=fopen($source,“r”))!==FALSE){
$stock\u handle=fopen($source\u stock,“w+”);
$row=0;
$col=array();
而(($line=fgetcsv($handle,100000,“,”)!==FALSE){
未设置($line[1]);
未设置($line[2]);
未设置($line[3]);
未设置($line[4]);
未设置($line[5]);
未设置($line[6]);
未设置($line[8]);
未设置($line[9]);

如果($row%$delayment您可以将那些
unset()
调用替换为

$line = array($line[0], $line[7]);
或者,请记住
unset()
接受多个参数

unset($line[1], $line[2], ...);

你可以稍微加快一点,但这也是一个微时间()-可测量的改进:感觉它不会明显加快

while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) { 
    if($row++ % $retardment < 1){ 
        fputcsv($stock_handle, array($line[0],$line[7])); 
    } 
}
while($line=fgetcsv($handle,100000,“,”)!==FALSE){
如果($row++%$delayment<1){
fputcsv($stock_handle,array($line[0],$line[7]));
} 
}
但是由于您的脚本是IO绑定的,所以实际的读写操作是最慢的函数,您无法加快这些操作的速度


使用with a可能是另一种方法,但除非您可以减少磁盘访问时间,否则您不会看到明显的改进

为什么不逐行检查文件,找出与您想要的两列相对应的条目,然后将它们写入输出文件?我想,随着内存的释放,它会加快速度。您知道吗在
while
循环的每个迭代过程中,我们都将一个新数组分配给
$line
,所以内存使用量几乎可以忽略不计。获取您想要的并输出它。不要担心
取消设置
会在一个循环中设置一堆您不关心的东西。因此,不使用unset似乎根本不会加快速度。我没有mircoti我检查一下,但它似乎也一样长。我基本上把while循环中的所有内容都减少到fputcsv($stock\u handle,array($line[0],$line[7]));在64位裸骨linux云服务器中的1024gb ram上,速度似乎也一样慢。30K线路大约需要10-15分钟。时间与以前大致相同。现在,我可以在大约1.5分钟内完成同样的任务,从开始到结束,用excel“手工”完成.并不是说我们在这些盒子上做的任何事情都是手工的哈哈…我会试试这个..我希望找到一个“删除列”键入隐藏起来的函数。在实践中,打开excel并删除列,然后将其保存以供此脚本运行会更快。但我不能一直手工操作。lol。这就是上面提到的最终方法中使用的方法。谢谢-因此,在我看来,我虽然只访问了4次文件,但打开读取,写入clos每个文件有两个…但是…考虑一下..fputcsv()正在写入文件,所以最好的方法可能是构建我想要写入的内容并将其存储在内存中,然后一次写入所有内容?可能是吗?
while (($line = fgetcsv($handle, 100000, ",")) !== FALSE) { 
    if($row++ % $retardment < 1){ 
        fputcsv($stock_handle, array($line[0],$line[7])); 
    } 
}