如何用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ñ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); $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
相关产品推荐
相关产品推荐

