【问题标题】:Split file every n lines [closed]每n行拆分文件[关闭]
【发布时间】:2014-01-06 03:44:54
【问题描述】:

我正在使用 csv 格式的皇家邮政 PAF 数据库(大约 2900 万行),需要将数据拆分成大约 1000 行的文件。

我找到this solution来写文件,但是不知道怎么写。打开文件,然后 b.告诉脚本在复制后从原始文件中删除这些行。

谁能给点建议?

【问题讨论】:

标签: php


【解决方案1】:

它需要在 PHP 中吗?如果您使用的是 Unix/Linux 系统,则可以使用 split 命令。

split --lines=1000 mybigfile.csv

http://en.wikipedia.org/wiki/Split_%28Unix%29

【讨论】:

  • 很遗憾,是的,因为它会被连接到 wordpress mu-plugin 以从 wp-cron 运行
  • 您的 WordPress 安装是否在 Unix/Linux 系统上运行?您可以从插件运行外部程序,除非系统管理员出于安全原因阻止了它。见us2.php.net/function.exec
  • 它是一个 linux 机器,但是他们已经锁定了它:(
【解决方案2】:

我不知道royal PAF 数据库,但是你用fopen() 打开文件,用fgets() 读取一行并用unlink() 删除文件。

您找到的解决方案显示了每 1000 行拆分的想法,但在您的情况下,根本不需要调用任何 csv 函数。这只是一个简单的“将每 1000 行复制到新文件中”。

$bigFile = fopen("paf.csv", "r");
$j = 0;

while(! feof($bigFile)) {
    $smallFile = fopen("small$j.csv", "w");
    $j++;

    for ($i = 0; $i < 1000 && ! feof($bigFile); $i++) {
        fwrite($smallFile, fgets($bigFile));

    }
    fclose($smallFile);

}
fclose($bigFile);
unlink("paf.csv");

【讨论】:

  • 感谢您的建议,您知道删除文件第一部分而不是整个文件的功能吗?
  • 您不能只删除原子函数中的部分。您必须用新内容覆盖旧文件。在您的情况下,我建议您在完成拆分后简单地删除文件。
  • 好的,谢谢,我试图这样做,这样 php 就不会超时,如果这样做,它可以从中断的地方继续。
  • 您可以increase the timelimit。但继续工作是个好主意。将现有的拆分文件作为您工作的标记。
  • 这将是在 cron 上运行的每月任务。我会检查 wpengine 是否允许这样做。