Laavel 바이트 수의 가시 데이트 파일만 읽는 방법의 노트
개시하다
CSV를 통해 외부 협업을 진행할 때 읽기 측면에서 CSV 데이터가 올바르지 않은지 미리 검사하는 방법이 있습니다.
예를 들어 실제 데이터를 한 쌍의 제어 파일로 미리 저장하고 제어 파일에 실제 데이터의 바이트 수를 저장하는 방법이다.
따라서 CSV 데이터가 제작 중인 것이 아니라는 것을 확인할 수 있습니다.
이런 방법을 취할 때
라벨에게 이게 필요하니까 손을 움직이면서 조사해.
시도해 본 일
Laavel 프로젝트 만들기
$ composer create-project laravel/laravel load-file-csv-with-ctl
동작 확인용 파일 준비
실제 데이터(.csv로 통일)와 제어 파일(.ctl로 통일)을 쌍으로 제작하고 다음 모델로 준비합니다.
$ cd storage/app/public/
$ head *
==> output_20210703072428.csv <==
1,apple,100
2,banana,150
3,cherry,200
==> output_20210703072428.ctl <==
38
==> output_20210703073006.csv <==
3,apple,100
2,banana,150
1,cherry,200
==> output_20210703073006.ctl <==
10
==> output_20210703073017.csv <==
3,apple,100
1,banana,150
2,cherry,200
설명 처리
routes/web.php
처리를 모두 씁니다.routes/web.php
<?php
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\File;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Route::get('/list', function () {
$path = storage_path( 'app/public' );
$fileNames = array();
$files = File::files( $path );
foreach( $files as $file ){
$fileNames[] = pathinfo( $file->getFilename(), PATHINFO_FILENAME );
}
$set = array_unique( $fileNames );
foreach( $set as $elm ){
$ctlContent = [];
$csvContent = [];
$target = $path . '/' . $elm;
// See: https://www.php.net/manual/ja/function.file-exists.php
if ( file_exists( $target . '.ctl' ) ){
$ctlContent = file_get_contents( $target . '.ctl' ) ?? '';
} else {
echo( $elm . '.ctl' . 'は存在しませんでした。');
}
if ( file_exists( $target . '.csv' ) ){
$csvContent = new \SplFileObject( $target . '.csv' );
$csvContent->setFlags(
\SplFileObject::READ_CSV | // CSV 列として行を読み込む
\SplFileObject::READ_AHEAD | // 先読み/巻き戻しで読み出す
\SplFileObject::SKIP_EMPTY | // 空行は読み飛ばす
\SplFileObject::DROP_NEW_LINE // 行末の改行を読み飛ばす
);
} else {
echo( $elm . '.csv' . 'は存在しませんでした。' . "\n");
}
if ( intval( $ctlContent ) !== $csvContent->getSize() ) {
echo( $elm . '.csv' . 'のサイズが.ctlファイルの内容と一致しません' . "\n");
} else {
echo( $csvContent . "\n");
}
}
});
보태다
// See: https://www.php.net/manual/ja/function.file-exists.php
if ( file_exists( $target . '.ctl' ) ){
$ctlContent = file_get_contents( $target . '.ctl' ) ?? '';
} else {
echo( $elm . '.ctl' . 'は存在しませんでした。');
}
file_exists를 사용하면 file_exists( <フルパス> )
에서 파일의 존재를 확인할 수 있습니다. if ( intval( $ctlContent ) !== $csvContent->getSize() ) {
echo( $elm . '.csv' . 'のサイズが.ctlファイルの内容と一致しません' . "\n");
} else {
ctl에서 읽은 내용을 intval로 수치로 변환하지 않으면 문자로 평가합니다.그래서 전환 중이야.동작 확인
$ php artisan serve
$ curl http://localhost:8000/list
1,apple,100
output_20210703073006.csvのサイズが.ctlファイルの内容と一致しません
output_20210703073017.ctlは存在しませんでした。output_20210703073017.csvのサイズが.ctlファイルの内容と一致しません
출력 1apple, 100, 기타 확인 실패.
Reference
이 문제에 관하여(Laavel 바이트 수의 가시 데이트 파일만 읽는 방법의 노트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/katoaki/articles/70e6af085f0a6f텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)