如何使用 Laravel 读取目录中的所有文件内容
how to read all file contents in a directory with Laravel
我在一个目录中有很多文件,我想读取所有文件并将它们保存在数据库中。
我知道该怎么做,但我知道的方式是所有文件内容将同时加载到内存中,Web 应用程序将停止运行。我倾向于设置一些限制,比如它同时读取 300 个文件,然后再读取下 300 个文件。
如您所见,我这里有 736 个文件。
这是我的样本文件内容:
我正在使用此代码拆分它们。
foreach ($contents as $content) {
$slice = preg_split("/\r\n|\r|\n/", $content);
}
结果:
您可以使用 laravel 的 filesytem 和 Storage facade 来实现:
$files = Storage::disk('public')->files('path/to/files');
foreach ($files as $file) {
$contents = Storage::disk('public')->get($file);
// Save contents to DB;
}
您也可以通过构建内容数组来分批完成它们
$files = Storage::disk('public')->files('path/to/files');
$contents = [];
$toMove = [];
foreach ($files as $file) {
$content = Storage::disk('public')->get($file);
$slice = preg_split("/\r\n|\r|\n/", $content);
$contents[] = [
'metadata' => $slice[0],
'data1' => $slice[1],
'data2' => $slice[2],
'data3' => $slice[3],
];
$toMove[] = $file;
if (count($contents) === 10) {
DB::table('informations')->insert($contents);
foreach($toMove as $file) {
Storage::disk('public')
->move($file , 'done/'.Str::of($file)->after('/'));
}
$contents = [];
$toMove = [];
}
}
if (count($contents)) {
DB::table('informations')->insert($contents);
foreach($toMove as $file) {
Storage::disk('public')
->move($file , 'done/'.Str::of($file)->after('/'));
}
}
我在一个目录中有很多文件,我想读取所有文件并将它们保存在数据库中。 我知道该怎么做,但我知道的方式是所有文件内容将同时加载到内存中,Web 应用程序将停止运行。我倾向于设置一些限制,比如它同时读取 300 个文件,然后再读取下 300 个文件。 如您所见,我这里有 736 个文件。
这是我的样本文件内容:
我正在使用此代码拆分它们。
foreach ($contents as $content) {
$slice = preg_split("/\r\n|\r|\n/", $content);
}
结果:
您可以使用 laravel 的 filesytem 和 Storage facade 来实现:
$files = Storage::disk('public')->files('path/to/files');
foreach ($files as $file) {
$contents = Storage::disk('public')->get($file);
// Save contents to DB;
}
您也可以通过构建内容数组来分批完成它们
$files = Storage::disk('public')->files('path/to/files');
$contents = [];
$toMove = [];
foreach ($files as $file) {
$content = Storage::disk('public')->get($file);
$slice = preg_split("/\r\n|\r|\n/", $content);
$contents[] = [
'metadata' => $slice[0],
'data1' => $slice[1],
'data2' => $slice[2],
'data3' => $slice[3],
];
$toMove[] = $file;
if (count($contents) === 10) {
DB::table('informations')->insert($contents);
foreach($toMove as $file) {
Storage::disk('public')
->move($file , 'done/'.Str::of($file)->after('/'));
}
$contents = [];
$toMove = [];
}
}
if (count($contents)) {
DB::table('informations')->insert($contents);
foreach($toMove as $file) {
Storage::disk('public')
->move($file , 'done/'.Str::of($file)->after('/'));
}
}