2016-05-25 17 views
0

Ich habe eine CSV-Datei, die etwa 500000 Anzahl von Zeilen haben. Was ich tun muss, ist die ersten 100 Zeilen in der ersten Schleife zu nehmen und die Zeilen zu manipulieren (sprich, sende die ersten 100 IDs an die API und speichere die Antwort). In der zweiten Schleife, überspringen Sie die ersten 100 Zeilen (bereits vergeben) und nehmen Sie weitere 100 Zeilen und senden Sie eine Anfrage an den Web-Service. Ähnlich, in der dritten Schleife, überspringe erste 200 Reihen und nimm weitere 100 Reihen und sende Anfrage zum Webservice und so weiter ...überspringen n Zeilen der CSV-Datei in PHP

Ich kann einzelne Reihen mit unterem Code nehmen. (Getestet: funktioniert super)

if (($handle = fopen($filename, "r")) !== FALSE) { 
    $id = 1; 
    $line = fgetcsv($handle); //skip first row 

    //fetch data from each row 
    while (($data = fgetcsv($handle, ",")) !== FALSE) { 
     $hotel_id = $data[0]; 
     //call service to request to web service 
     $hotelDetailRequest = (new \Services\Hotel\Hotel)->getHotelStaticData($hotel_id); 
     //do stuff to response 
    } 
} 

In ähnlicher Weise kann ich einige erste Zeilen überspringen, da, wie ich erste Zeile übersprungen Hinzufügen

$line = fgetcsv($handle); 
$line = fgetcsv($handle); 
$line = fgetcsv($handle); 

Aber das ist nicht mein erwartete Ergebnis wie oben erläutert. Ich benutze PHP (Laravel). Ich googelte, konnte aber keine passenden finden, die meinen Kriterien entsprachen. Hat jemand das gleiche Problem?

Jede Hilfe wäre willkommen. Vielen Dank, dass Sie

+0

Warum müssen Sie dies tun? Sind Sie besorgt über die Häufigkeit, mit der die Anforderungen gesendet werden, oder handelt es sich um ein Leistungsproblem? Können Sie näher erläutern, warum Sie dies tun müssen, damit wir die zugrunde liegenden Probleme besser verstehen und vielleicht eine Lösung bereitstellen können? – Ohgodwhy

+0

Ja, ich bin besorgt über die Häufigkeit, mit der die Anfragen gesendet werden. Also, ich führe die Abfrage nach Mitternacht und vormorgen durch. Ich speichere tatsächlich statische Daten in meiner Datenbank, wie in meinem Web-Service dokumentiert. – vijayrana

Antwort

1

hier ist eine Lösung für Sie:

<?php 
$filename = "the_data.csv"; 
$chunk_size = 200; 

// parse csv file into an array 
$csv_data = array_map('str_getcsv', file($filename)); 

// split data array into chunks 
$chunked_data = array_chunk($csv_data, $chunk_size); 

foreach($chunked_data as $chunk){ 

    // here you have $chunk_size row data 
    // iterate in chunk 
    foreach($chunk as $row){ 
     $hotel_id = $row[0]; 

     // send request to web service 
     // do stuff to response 
    } 

    sleep(1); 
} 
?> 
+0

Code konnte nach dieser Zeile nicht ausgeführt werden: '$ csv_data = array_map ('str_getcsv', Datei ($ filename));' – vijayrana

+0

gibt es eine Fehlerausgabe? – talhasch

+0

Es heißt: 'Die mydomain.loc Seite funktioniert nicht mydomain.loc ist derzeit nicht in der Lage, diese Anfrage zu bearbeiten. HTTP-FEHLER 500'. – vijayrana

0

Sie die SplFileObject mit ->seek($start) kombiniert nutzen können. Wir können uns auf die limit/offset Beziehung beziehen, die Sie mit einer normalen MySQL-Datenbank verwenden würden; hier ist ein Beispiel:

$file = SplFileObject("myfile.csv"); 

$rules = DB::query("select * from file_rules where id = 1"); 

if ($rules->limit) { 
    $file->seek($rules->offset); 
} 

An dieser Stelle können Sie nur eine einfache Schleife tun und die Indexzahl gegen den Offsetwert vergleichen.

foreach ($file as $index => $row) { 
    if ($file->valid() && $index <= $rules->limit) { 
     //perform your calls to do your API request 
    } 
} 

Wenn Sie fertig sind, einfach Ihre DB Datensätze aktualisieren:

DB::query('update file_rules set offset='.$rules->offset+$rules->limit.' where id =1'); 

Dies ist die jist davon. Ersetzen Sie meinen DB-Pseudo-Code durch Ihren eigenen. Dadurch können Sie es als CRON ausführen und die Datenbank als Interaktionspunkt verwenden, um Ihre limit/offset zu erhalten und mit einem seek auf Ihre Schleife anzuwenden, um weiteren Speicher zu sparen.

+0

Ich konnte nicht verstehen, was Sie eigentlich @ Ohgodwhy tun. – vijayrana

+0

Könnten Sie bitte den Verweis auf Laravel erklären. – vijayrana

+0

@vijayrana Sie meinen 'DB :: query'? Ich bin mir nicht sicher, nach welcher Spezifität Sie suchen. Laravel ist ein Wrapper, der auf PHP aufsetzt und daher nicht in Basis-PHP eingreift. – Ohgodwhy