2016-03-19 6 views
0

Bu biraz uzun, bu yüzden önceden özür dilerim.Her satırın birden çok sütunun bulunduğu bir csv dosyası nasıl ayrıştırılır?

Bir csv dosyasını a; sınırlayıcı ve herhangi bir nedenle sadece ilk dizeyi ayrıştırır ve sonra dosyadaki sonraki satıra geçilir. Ben veri aktarma işlemini test etmek için en sonunda Csvimport sınıfta bir print_r($content); break; yaptı ve bu bana veren şeydir: Bir problem

Array ([1] => Array ([Key1] => Key1) [2] => Array ([Key2] => Key2)) 1

. İkincisi, görüntüye gitmesine izin verdiğimde, $field['key'], $field['address'], $field['lotno'], vb. Her satır için hataları atar, anahtar, adres, lotno undefined.

Bu benim csv dosyasıdır:

Key1;Address1;LotNo1;Acres1;YrBuilt1; 
Key2;Address2;LotNo2;Acres2;YrBuilt2; 

Bu benim csv alma kitaplığı dosyasıdır: Bu benim denetleyicisi olan

class Csvimport { 

    var $fields;/** columns names retrieved after parsing */ 
    var $separator = ';';/** separator used to explode each line */ 
    var $enclosure = '"';/** enclosure used to decorate each field */ 
    var $max_row_size = 4096;/** maximum row size to be used for decoding */ 

    function parse_file($p_Filepath) { 

    $file = fopen($p_Filepath, 'r'); 
    $this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure); 
    $keys = str_getcsv($this->fields[0]); 

    $i = 1; 
    while (($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false) { 
     if ($row != null) { // skip empty lines 
      $values = str_getcsv($row[0]); 
      if (count($keys) == count($values)) { 
       $arr = array(); 
       for ($j = 0; $j < count($keys); $j++) { 
        if ($keys[$j] != "") { 
         $arr[$keys[$j]] = $values[$j]; 
        } 
       } 

       $content[$i] = $arr; 
       $i++; 
      } 
     } 
    } 
    fclose($file); 

    // echo print_r($content); break; 
    return $content; 
    } 
} 

:

$import = './application/imports/unitimport.csv'; 
$this->load->library('csvimport'); 
$data['importdata'] = $this->csvimport->parse_file($import); 

Ve bu benim görünümüdür:

<?php foreach($importdata as $field): ?> 

<tr> 

    <td><p><?php echo $field['key'] ?><p></td> 

    <td><p><?php echo $field['address'] ?><p></td> 

    <td><p><?php echo $field['lotno'] ?><p></td> 

    <td><p><?php echo $field['acres'] ?><p></td> 

    <td><p><?php echo $field['yrbuilt'] ?><p></td> 

</tr> 

<?php endforeach ?> 

Neyi eksik?

cevap

1

Bu eski bir soru ... ama buyur:

Bu hat:

$this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure); 

$ this-> alanlarına bir diziye dosyanızın bir ilk satırı kaydeder. Bu noktada Yani:

$keys = str_getcsv($this->fields[0]); 

str_getcsv() $this-fields ilk değerini ayrıştırma ve bir dizi dönüştürerek edilir: Eğer bir sonraki satırda

$this->fields = array('Key1','Address1','LotNo1','Acres1','YrBuilt1'); 

.

$values = str_getcsv($row[0]); 

$values sadece ilk veri sütunu saklar olan tek öğe şu çünkü: Yani bu noktada: Bu satır ile veri satırları arasında yineleme zaman

$keys = array('Key1'); 

Bu aynı hatayı tekrarlamak çözümlenir.

Aşağıdaki kod çalışması gerekir:

class Csvimport 
{ 
    var $fields;/** columns names retrieved after parsing */ 
    var $separator = ';';/** separator used to explode each line */ 
    var $enclosure = '"';/** enclosure used to decorate each field */ 
    var $max_row_size = 4096;/** maximum row size to be used for decoding */ 

    function parse_file($p_Filepath) 
    { 
     $file = fopen($p_Filepath, 'r'); 
     $this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure); 

     $content = array(); 
     $i = 1; 
     while (($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false) 
     { 
      if ($row != null) // skip empty lines 
      { 
       for ($j = 0; $j < count($this->fields); $j++) 
       { 
        $content[$i][$this->fields[$j]] = $row[$j]; 
       } 
       $i++; 
      } 
     } 
     fclose($file); 
     return $content; 
    } 
} 
İlgili konular