Laavel 바이트 수의 가시 데이트 파일만 읽는 방법의 노트

18804 단어 Laraveltech

개시하다


CSV를 통해 외부 협업을 진행할 때 읽기 측면에서 CSV 데이터가 올바르지 않은지 미리 검사하는 방법이 있습니다.
예를 들어 실제 데이터를 한 쌍의 제어 파일로 미리 저장하고 제어 파일에 실제 데이터의 바이트 수를 저장하는 방법이다.
따라서 CSV 데이터가 제작 중인 것이 아니라는 것을 확인할 수 있습니다.
이런 방법을 취할 때
  • 제어 파일이 있는지 여부
  • 파일에 기재된 바이트 수와 실제 데이터의 바이트 수가 일치하는지 제어
  • 이런 경우 분류를 하면서 읽는 처리가 필요하다.
    라벨에게 이게 필요하니까 손을 움직이면서 조사해.

    시도해 본 일


    Laavel 프로젝트 만들기


    $ composer create-project laravel/laravel load-file-csv-with-ctl
    

    동작 확인용 파일 준비


    실제 데이터(.csv로 통일)와 제어 파일(.ctl로 통일)을 쌍으로 제작하고 다음 모델로 준비합니다.
  • 일반
  • .ctl의 바이트 수가 이상합니다
  • .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, 기타 확인 실패.

    좋은 웹페이지 즐겨찾기