按照行数、分割的文件数分别分割txt文件的方法
按照行数对txt文件进行分割
/*
分割TXT文件 通过行分割文件
$file_name 文件名
$number_lines 分割成多少个文件
*/
function split_file_by_lines($file_name, $number_lines)
{
try
{
if(!file_exists($file_name)) {
throw new Exception("文件不存在!");
}
// 分割文件名和后缀
$filename = explode('.', $file_name)[0];
// 将一个数组分割成多个
$contents_array = array_chunk(file($file_name), $number_lines);
if(!$contents_array || !is_array($contents_array)) {
throw new Exception("文件内容不合法!");
}
array_walk($contents_array, function($contents, $k, $filename){
foreach($contents as $value){
file_put_contents("{$filename}-{$k}.txt", $value, FILE_APPEND);
}
}, $filename);
}
catch(Exception $e)
{
echo $e->getMessage();
}
}
// 每500行生成一个txt文件
split_file_by_lines("敏感词.txt", 500);
按要求生成的文件数分割
/*
通过分割的文件数分割文件
$file_name 文件名
$filecount 文件数
*/
function split_file_by_file($file_name, $file_count)
{
try
{
if(!file_exists($file_name)) {
throw new Exception("文件不存在!");
}
$arr = file($file_name);
$arrLen = count($arr);
// 分割文件名和后缀
$file_name = explode('.', $file_name)[0];
// 每个数组中含有多少项
$number_lines = floor($arrLen / $file_count) + ($arrLen % $file_count);
// 将一个数组分割成多个
$contents_array = array_chunk($arr, $number_lines);
if(!$contents_array || !is_array($contents_array)) {
throw new Exception("文件内容不合法!");
}
array_walk($contents_array, function($contents, $k, $file_name){
foreach($contents as $value){
// 去掉左右的空格 再写入
$val = trim($value);
file_put_contents("{$file_name}-{$k}.txt", $val, FILE_APPEND);
}
}, $file_name);
}
catch(Exception $e)
{
echo $e->getMessage();
}
}
// 将txt文件分割为3个txt文件
split_file_by_file("敏感词.txt", 3);
两个函数的解析
array_chunk
array_chunk() 函数把一个数组分割为新的数组块。
array_chunk(array,size,preserve_keys);
参数 | 描述 |
---|---|
array | 必需。规定要使用的数组。 |
size | 必需。一个整数,规定每个新数组块包含多少个元素。在此处就是新文件中包含的行数。 |
preserve_key | 可选。可能的值:
|
array_walk
array_walk() 函数对数组中的每个元素应用用户自定义函数。在函数中,数组的键名和键值是参数。
注意,这个函数使用的时候,是有作用域的。
$a = 'a';
array_walk($arr, function($arrItem, $key, $a, $多个参数...) {
... // 这里无法直接访问$a,必须将$a传入 并在函数中接收
}, $a, $多个参数...)