2014-01-20 9 views
0

Я ищу импорт файла CSV, но этот файл довольно большой.Импорт больших CSV-файлов

Что я ищу сделать, это 2 вещи:

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

Данные CSV могут ONLY быть вставлены, если файл является действительным (все или ничего)

Проблема в том, я m цикл через дважды, 1-й для проверки полей CSV действительны, а затем еще один цикл for для сохранения.

Проблема в памяти. У меня заканчивается память (файл - 100 000 строк с 45 полями)

Есть ли более простой способ сделать это и уменьшить память? Я использую AR-реализацию, будет ли использование PDO быстрее?

Благодаря

EDIT:

 $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

Вы уже пробегаем по данным в первом foreach. Почему вы не проверяете поля внутри этого цикла, если проверка прошла, добавьте в массив сохранение и сохранение только (в одной транзакции), если цикл завершен.

+0

Какова производительность, хотя сохранение этих данных в одной транзакции? Файл может увеличиться до 1 000 000 строк плюс! –

+0

Это также означает, что вы выполните 1,000,000 операций в БД, когда сможете сделать все это в 1! Повторение результатов через несколько раз также совершенно не нужно и, безусловно, убийца производительности. – mcryan

 Смежные вопросы

  • Нет связанных вопросов^_^