php - Import only non-existing data to database from CSV -


i have created script read data csv file, check if data exists in database , import if not. if data exist (the code of specific product) rest of information needs updated csv file.

for example; i have member code wtw-2lt, named alex , surname johnson in csv file. script checks if member code wtw-2lt, named alex , surname johnson exist, if does, contact details , details needs updated script (other details subject , lecturer needs checked, details in 1 line in csv), if doesn't exist new member have created.

my script have far minimum other checks prevent distraction now;

while ($row = fgetcsv($fp, null, ";")) {     if ($header === null) {         $header = $row;         continue;     }      $record = array_combine($header, $row);      $member = $this->em->getrepository(member::class)->findoneby([         'code' =>$record['member_code'],         'name' =>$record['name'],         'surname' =>$record['surname'],     ]);      if (!$member) {         $member = new member();         $member->setcode($record['member_code']);         $member->setname($record['name']);         $member->setname($record['surname']);     }         $member->setcontactnumber($record['phone']);     $member->setaddress($record['address']);     $member->setemail($record['email']);      $subject = $this->em->getrepository(subject::class)->findoneby([         'subject_code' => $record['subj_code']     ]);      if (!$subject) {         $subject = new subject();         $subject->setcode($record['subj_code']);     }     $subject->settitle($record['subj_title']);     $subject->setdescription($record['subj_desc']);     $subject->setlocation($record['subj_loc']);      $lecturer = $this->em->getrepository(lecturer::class)->findoneby([         'subject' => $subject,         'name' => $record['lec_name'],         'code' => $record['lec_code'],     ]);      if (!$lecturer) {         $lecturer = new lecturer();         $lecturer->setsubject($subject);         $lecturer->setname($record['lec_name']);         $lecturer->setcode($record['lec_code']);     }     $lecturer->setemail($record['lec_email']);     $lecturer->setcontactnumber($record['lec_phone']);      $member->setlecturer($lecturer);      $validationerrors = $this->validator->validate($member);     if (!count($validationerrors)) {         $this->em->persist($member);         $this->em->flush();     } else {         // ...     } } 

you can notice script has query database 3 times check if 1 csv line exists. in case have files 2000+ lines, every line perform 3 queries check if line exists or not quite time-consuming.

unfortunately, can't import rows in batches because if 1 subject doesn't exist create many times until batch flushed database , sit duplicate records serve no point.

how can improve performance , speed max? first records database , store in arrays (memory consuming?) , checks , add line array , check there...

can please me find way improve (with sample code please?)

to honest, find 2000+ rows 3x amount of queries not much. but, since asking performance, here 2 cents:

using framework give overhead. meaning if make code in native php, run quicker. im not familiar symfony, assume store data in database. in mysql can use command insert ... on duplicate key update. if have set 3 fields (code, name, lastname) primary key (which assume), can use to: insert data, if key exists, update values in database. mysql checsk you, see if data has changed: if not, no diskwrite happen.

im quite can write native sql symfony, allowing use security framework provides, yet speeding insert.


Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -