You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP实现CSV文件按指定行数拆分功能?

CSV文件拆分功能:问题排查与修复

问题背景

我正在开发一项功能,支持用户通过带Bootstrap样式的HTML表单上传CSV文件,并自定义每个拆分文件的行数,后端通过PHP将原文件分割为多个小CSV文件。

目前遇到的问题:

  • 提交表单后程序卡顿无响应
  • 生成的第一个拆分文件为空
  • 部分测试场景下生成的文件仅包含随机一行数据

初始问题代码

ob_start();
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
if(isset($_POST['carga']))
{
    $filas=$_POST["filas"];
    //VALIDACION Y CARGA DE ARCHIVO CSV
    $directorio_carga="temp/";
    $personalizado=$directorio_carga."archivo_base.csv";
    if(is_dir($directorio_carga)===false)
    {
        mkdir($directorio_carga,0777,true);
    }   
    $archivo=$directorio_carga.basename($_FILES["archivo_usuario"]["name"]);
    $cargaok=1;
    $escsv=strtolower(pathinfo($archivo,PATHINFO_EXTENSION));
    $formato_valido=array('application/vnd.ms-excel','text/plain','text/csv','text/tsv');
    $nombre_archivo=basename($_FILES["archivo_usuario"]["name"]); 

    if(in_array($_FILES["archivo_usuario"]["type"],$formato_valido))
    {
        $cargaok=1;
    }
    else
    {
        echo "El formato de archivo no es valido ";
        $cargaok=0;
    }
    if($_FILES["archivo_usuario"]["size"]>50000000)
    {
        echo "Archivo demasiado grande, tamaño máximo 50MB";
        $cargaok=0;
    }
    if($cargaok==0)
    {
        echo "el archivo no pudo cargarse";
    }
    else
    {
        if(move_uploaded_file($_FILES['archivo_usuario']['tmp_name'],$archivo))
        {
            rename("$archivo","$personalizado");            
            echo "El archivo ".$personalizado." ha sido cargado correctamente \n";
        }
    }
    $fp = file($personalizado);
    $archivos= intval((count($fp)/$filas)+1);
    fclose($csv_file);

    $csv_file=fopen($personalizado,"r");
    while(!feof($csv_file))
    {
        $rows[] = fgetcsv($csv_file, 1000, ';');
    }
    fclose($csv_file);

    $z=1;
    $r=1;
    $file="temp/split ".$z." de ".$archivos.".csv";

    for($i=1;$i<=count($rows);$i++)
    {
        if($r==$filas)
        {
            $z++;
            $file="temp/split ".$z." de ".$archivos.".csv";
            $r=1;
        }
        //echo $i." - ".$file." - ".$rows[$i][0]."- ".$rows[$i][1]."<br>";
        $escribe=fopen($file,"w");
        fputcsv($escribe, $rows);
        $r++;
    }
}
array_map('fclose', get_resources('stream'));
ob_end_flush();

经@Barmar建议修复后的可用代码

<?php
ob_start();
ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);
if(isset($_POST['carga']))
{
    $filas=$_POST["filas"];
    //VALIDACION Y CARGA DE ARCHIVO CSV
    $directorio_carga="temp/";
    $personalizado=$directorio_carga."archivo_base.csv";
    if(is_dir($directorio_carga)===false)
    {
        mkdir($directorio_carga,0777,true);
    }   
    $archivo=$directorio_carga.basename($_FILES["archivo_usuario"]["name"]);
    $cargaok=1;
    $escsv=strtolower(pathinfo($archivo,PATHINFO_EXTENSION));
    $formato_valido=array('application/vnd.ms-excel','text/plain','text/csv','text/tsv');
    $nombre_archivo=basename($_FILES["archivo_usuario"]["name"]); 

    if(in_array($_FILES["archivo_usuario"]["type"],$formato_valido))
    {
        $cargaok=1;
    }
    else
    {
        echo "El formato de archivo no es valido ";
        $cargaok=0;
    }
    if($_FILES["archivo_usuario"]["size"]>50000000)
    {
        echo "Archivo demasiado grande, tama&ntilde;o m&aacute;ximo 50MB";
        $cargaok=0;
    }
    if($cargaok==0)
    {
        echo "el archivo no pudo cargarse";
    }
    else
    {
        if(move_uploaded_file($_FILES['archivo_usuario']['tmp_name'],$archivo))
        {
            rename("$archivo","$personalizado");            
            echo "El archivo ".$personalizado." ha sido cargado correctamente \n";
        }
    }
    $fp = file($personalizado);
    $archivos= intval((count($fp)/$filas)+1);

    $csv_file=fopen($personalizado,"r");
    while(!feof($csv_file))
    {
        $rows[] = fgetcsv($csv_file, 1000, ';');
    }
    fclose($csv_file);

    $z=1;
    $r=1;
    $f=0;
    $file="temp/split ".$z." de ".$archivos.".csv";
    $escribe=fopen($file,"w");
    for($i=1;$i<count($rows);$i++)
    {
        if($r==$filas)
        {
            $z++;
            $file="temp/split ".$z." de ".$archivos.".csv";
            $r=1;
            $escribe=fopen($file,"w");
        }
        fputcsv($escribe, $rows[$i]);
        $r++;
    }
}
array_map('fclose', get_resources('stream'));
ob_end_flush();
?>

配套Bootstrap样式HTML表单代码

<form name="file" id="file" enctype="multipart/form-data" method="post" action="execute.php">
    <div class="row">
        <div class="col-sm-3"></div>
        <div class="col-sm-6">
            <div class="card">
                <div class="card-body" style="text-align:center;">
                    <h2>Segregador de archivos CSV</h2><br>
                    <input type="text" class="form-control" name="filas" placeholder="Especifica cantidad de filas por archivo" required=""><br><br>
                    <input type="file" class="form-control" name="archivo_usuario" required=""><br>
                    <input type="submit" value="Aceptar" name="carga" class="btn btn-success">
                </div>                  
            </div>
        </div> 
        <div class="col-sm-3"></div>   
    </div>
</form>

内容的提问来源于stack exchange,提问作者adel azeroth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 07:45:35