2014-07-26 6 views
0

Mon but est de récupérer un fichier zip à partir d'un serveur Web tiers, de récupérer le fichier CSV contenu dans le fichier et de le parcourir ligne par ligne pour le traitement ultérieur.PHP - Récupération du fichier Zip et traitement de son contenu

Le fichier que j'attrape est d'environ 2000 lignes.

Ceci est actuellement ce que j'ai ::

$zip = URL_TO_FILE; 
$internal_file = 'zipped_file_name.csv'; 

$ext = pathinfo($zip, PATHINFO_EXTENSION); 
$temp = tempnam(sys_get_temp_dir(), $ext); 

copy($zip, $temp); 

$file = file_get_contents("zip://$temp#$internal_file"); 

Les travaux ci-dessus, mais ne semble pas idéal. Normalement, je prends un fichier CSV décompressé et je le parcours simplement dans le contenu et j'englobe le contenu dans un tableau.

while (($line = fgetcsv($file)) !== false) { 
     if (array(0 => null) !== $line) { 
      $result[] = $line; 
     } 
    } 

Je ne suis pas sûr de savoir comment faire la même chose avec l'étape supplémentaire de saisir le contenu compressé. Aussi - J'ai seulement besoin des 100 dernières lignes du fichier, pas toutes les 2000 lignes.

  1. Existe-t-il une meilleure façon de procéder?
  2. Comment saisir uniquement les 100 dernières lignes?
  3. Comment parcourir le contenu ligne par ligne pour le mettre dans un tableau?

Très appréciée!

Répondre

0

Après une recherche sur I trouvé la solution ::

foreach(preg_split("/((\r?\n)|(\r\n?))/", $file) as $line){ 
     $result[] = $line; 
} 

Ce que cela fait itérer chaque ligne du contenu récupéré à partir du fichier. Après cela, tout ce que je fais est un tableau divisé pour obtenir les dernières informations ::

$newArray = array_slice($result, 0, 10); 

Pour ceux qui ne souhaitent pas reconstituer cela ensemble, voici le code en un seul morceau ::

$zip = $object->getUrl(); 
$file = '649.csv'; 
$ext = pathinfo($zip, PATHINFO_EXTENSION); 
$temp = tempnam(sys_get_temp_dir(), $ext); 

copy($zip, $temp); 

$file = file_get_contents("zip://$temp#$file"); 
unlink($temp); 

foreach(preg_split("/((\r?\n)|(\r\n?))/", $file) as $line) 
{ 
    $result[] = $line; 
} 
0

La fonction fgetcsv attend un descripteur de fichier. Donc, au lieu de file_get_contents, utilisez fopen:

$fh = fopen("zip://$temp#$internal_file", "r"); 

while(($line = fgetcsv($fh)) !== false) { 
    ... 
} 
Questions connexes