下面是按行数分割CSV文件的工作示例(由。定义) $numberOfLines )。只需设置你的路径 $filePath 并在shell中运行脚本,例如:
$numberOfLines
$filePath
php -f convert.php
脚本代码: convert.php
convert.php
<?php $filePath = 'data.csv'; $numberOfLines = 10000; $file = new SplFileObject($filePath); //get header of the csv $header = $file->fgets(); $outputBuffer = ''; $outputFileNamePrefix = 'datasplit-'; $readLinesCount = 1; $readlLinesTotalCount = 1; $suffix=0; $outputBuffer .= $header; while ($currentLine = $file->fgets()) { $outputBuffer .= $currentLine; $readLinesCount++; $readlLinesTotalCount++; if ($readLinesCount >= $numberOfLines) { $outputFilename = $outputFileNamePrefix . $suffix . '.csv'; file_put_contents($outputFilename, $outputBuffer); echo 'Wrote ' . $readLinesCount . ' lines to: ' . $outputFilename . PHP_EOL; $outputBuffer = $header; $readLinesCount = 0; $suffix++; } } //write remainings of output buffer if it is not empty if ($outputBuffer !== $header) { $outputFilename = $outputFileNamePrefix . $suffix . '.csv'; file_put_contents($outputFilename, $outputBuffer); echo 'Wrote (last time)' . $readLinesCount . ' lines to: ' . $outputFilename . PHP_EOL; $outputBuffer = ''; $readLinesCount = 0; }
如果它是从web运行的,因为php脚本的最大执行时间通常在30-60秒之间,并且有一个原因 - 你不要尝试事件把它扩展到一些巨大的数字。如果您希望脚本运行几个小时,您需要从命令行调用它,但您也可以从另一个脚本(例如您拥有的控制器)中调用它 你这样做:
exec('php -f convert.php');
就是这样。
您拥有的控制器将无法判断整个数据是否已转换,因为在此之前它将被终止。你可以做的是编写自己的代码 convert.php 更新数据库中的某些字段,应用程序中的其他控制器可以读取该字段并向用户打印runnig的进度 convert.php 。
另一种方法是创建可以放入队列的作业/作业,并且可以通过可以负责转换的工作人员的作业管理器流程运行,但我认为这对您的需求来说太过分了。
请记住,如果你拆分某些东西并在不同的位置加入,那么你可能会遇到在这个过程中出错的问题,那就是确保你成功拆分,转移,加入数据的方法是计算HASH即SHA-1分割前的整个6GB文件,将HASH发送到需要组合所有小部分数据的目的地,将它们组合成一个6GB文件,计算该文件的HASH并与发送的文件进行比较。请记住,拆分后数据的每个小部分都有自己的标题,以便CSV文件易于解释(导入),原始文件中只有一个标题行。