2017-03-23 20 views
0

これは私のコントローラのアップロード機能のコードです。ファイルの最初の行と行の残りの部分はomitted.Iがfile.Pleaseからすべての行がとにかくで支援を取得できるようにする必要がありますすることができます...事前に感謝csvファイルのアップロードが必要ですが、最初の行を取り込んでいます。

public function upload(Request $request) 
{ 
    //get file 
    //$allowed = array('csv'); 
    $upload=$request->file('upload'); 
    //$extension = File::extension($upload); 
    $filePath=$upload->getRealPath(); 


    //open and read 
    $file=fopen($filePath,'r'); 
    $header= fgetcsv($file); 
    $escapedHeader=[]; 

    //validate 
    foreach ($header as $key => $value) { 

     $lheader= strtolower($value); 
     $escapedItem=preg_replace('/[^a-z]/', '', $lheader); 

     array_push($escapedHeader, $escapedItem); 

    } 
    //looping throught other columns 

    while ($columns=fgetcsv($file)) { 

     if ($columns[0]=="") 
     { 
      continue; 
     } 

     $data= array_combine($escapedHeader, $columns); 
     dd($data); 
     //setting type 

     foreach ($data as $key => $value) { 
      $value=($key=="phone" || $key=="nationalid" || $key=="staffsalary")?(integer)$value:(string)$value; 
     } 

     //table update 
     $firstname=$data['firstname']; 
     $lastname=$data['lastname']; 
     $email=$data['email']; 
     $phone=$data['phone']; 
     $nationalid=$data['nationalid']; 
     $staffid=$data['staffid']; 
     $stafftitle=$data['stafftitle']; 
     $staffsalary=$data['staffsalary']; 


     $employees= Employees::firstOrNew(['phone'=>$phone,'nationalid'=>$nationalid]); 
     $employees->firstname=$firstname; 
     $employees->lastname=$lastname; 
     $employees->email=$email; 
     $employees->staff_id=$staffid; 
     $employees->staff_title=$stafftitle; 
     $employees->staff_salary=$staffsalary; 
     $employees->employer_phone = Auth::user()->phone; 
     $employees->save(); 

     return redirect()->route('home'); 

} 
} 
+0

あなたの '$ columns [0]'は偶然空の行ですか?また、私たちにCSVを教えてください。 –

+0

この依存関係は、簡単かつ簡単に使用できます。 http://www.maatwebsite.nl/laravel-excel/docs –

+0

以下の投稿のいずれかがあなたの質問に回答した場合は、それを承認済みとしてマークしてください。 –

答えて

0

メインにこの問題が発生した理由は、お客様のreturn redirect()->route('home');がお客様のwhileループ内にあるためです。外に出るように移動しても問題ありません。


また、これはちょうどFYIですが、あなたは少しが、あなたのコントローラをクリーンアップするCollectionsを使用することができます。

明らか
public function upload(Request $request) 
{ 
    $upload = $request->file('upload'); 

    $csv = collect(array_map('str_getcsv', file($upload->getRealPath()))); 

    $keys = array_map(function ($item) { 
     return preg_replace('/[^a-z]/', '', strtolower($item)); 
    }, $csv->shift()); 

    $csv 
     ->map(function ($row) use ($keys) { 
      return array_combine($keys, $row); 
     }) 
     ->reject(function ($row) { 
      return empty(array_first($row)); 
     }) 
     ->each(function ($row) { 

      $row = array_map(function ($value, $key) { 
       return in_array($key, ['phone', 'nationalid', 'staffsalary']) ? (integer)$value : (string)$value; 
      }, $row); 

      $employees = Employees::firstOrNew(['phone' => $row['phone'], 'nationalid' => $row['nationalid']]); 
      $employees->firstname = $row['firstname']; 
      $employees->lastname = $row['lastname']; 
      $employees->email = $row['email']; 
      $employees->staff_id = $row['staffid']; 
      $employees->staff_title = $row['stafftitle']; 
      $employees->staff_salary = $row['staffsalary']; 
      $employees->employer_phone = Auth::user()->phone; 
      $employees->save(); 
     }); 

    return redirect()->route('home'); 
} 

を、あなたは上記のコードを使用する必要はありません、ちょうど私私はあなたにそれを書く別の方法を示すだろうと思った。

私はif ($columns[0]=="")がそこにあったのか分かりませんでしたが、私はreject()メソッドでそれを追加しました。

希望すると便利です。

0

問題は、異なるOSのブレークラインです。

// take care of all possible newline-encodings in input file 
    $NEWLINE_RE = '/(\r\n)|\r|\n/'; 

    $csv = preg_replace($NEWLINE_RE,'===BREAK===', $old_csv); 
    foreach (explode('===BREAK===', $csv) as $k => $line){ 
     if(strlen($line) > 0) $lines[] = stripcslashes(trim($line)); 
    } 
関連する問題