2014-01-20 2 views
0

CSV 파일 가져 오기를 찾고 있는데이 파일은 다소 큽니다. 나는 '는 CSV 데이터 ONLY 파일이 유효한 경우 삽입 할 수 있습니다대용량 CSV 파일 가져 오기

1) Scan the CSV to validate values in particular fields 
2) Once the file is valid, import 

(모 아니면도)

문제는 : 내가 뭘 찾고있어

은 2 가지입니다 두 번 반복하는 m, 첫 번째 CSV 필드를 확인하려면 유효하고 다른 for 저장하려면 루프.

문제는 메모리입니다. 메모리가 부족합니다 (파일은 50 개의 필드와 45 개의 필드가 있습니다)

더 쉬운 방법이 있습니까? AR 구현을 사용하고 있는데 PDO를 사용하는 것이 더 빠릅니까?

감사

편집 : 당신은 이미 첫 번째 foreach의 데이터를 통해 반복하고

 $data = array(); 
     // open the file and loop through 
     if(($handle = fopen('details.csv', "r")) !== FALSE) { 
      $rowCounter = 0; 
      while (($rowData = fgetcsv($handle, 0, ",")) !== FALSE) { 
       if(0 === $rowCounter) { 
        $headerRecord = $rowData; 
       } else { 
        foreach($rowData as $key => $value) { 
         $data[ $rowCounter - 1][$headerRecord[ $key] ] = $value; 
        } 
       } 
       $rowCounter++; 
      } 
      fclose($handle); 
     } 

     $errors = array(); 
     // loop to check through the fields for validation 
     for($i=0;$i<count($data);$i++) { 
      $row++; 

      if(!valid_email($data[$i]['EMAIL']))) { 
       $errors[] = 'Invalid Email Address'; 
       break; 
      } 

     } 

     if(empty($errors)) { 
      for($j=0;$j<count($assocData);$j++) { 
      $row++; 

      $details = new Details(); 

      // set the fields here 
      $details->email = $data[$j]['EMAIL']; 

      $details->save(); 
      unset($details); 
      } 
     } 
+0

당신은'fopen'과'fgets'를 사용할 수 있으며 한 번에 한 줄씩 수동으로 파싱 할 수 있습니다. "유효합니까?"라는 것은 무엇을 의미합니까? – h2ooooooo

+0

메모리 사용량을 줄이기 위해 코드를보아야 할 것입니다. 또한 행 단위가 아닌 단일 트랜잭션으로 삽입해야합니다. – mcryan

+0

@ h2ooooooo 필자는 필드 측면에서 유효성을 검증 받았으며 (99로 시작하는 숫자 여야하고 15 자 이상이어야 함 등) 나는 fopen과 fgetcsv를 사용하여 열고 구문을 바꾼다 –

답변

0

. 유효성 검사 통과가 배열에 저장을 추가하고 루프가 완료된 경우에만 단일 트랜잭션으로 저장하면 해당 루프 내부의 필드의 유효성을 검사하지 않는 이유는 무엇입니까?

+0

하나의 트랜잭션에서 그러한 데이터를 저장하는 성능은 어떻게되는가? 이 파일은 1,000,000 개의 행을 더할 수 있습니다! –

+0

DB에서 1,000,000 건의 작업을 모두 수행 할 수 있다는 의미이기도합니다. 결과를 여러 번 반복하면 완전히 불필요하며 확실히 성능이 저하 될 수 있습니다. – mcryan