2013-03-16 8 views

Antwort

18

Hier ist eine einfache Möglichkeit, dies zu tun. Ich weiß nicht, was die Leute tun, aber ich benutze diese

Dies ist mein csv Leser Bibliothek

<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 

class CSVReader { 

    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_values = explode(',',$this->fields[0]); 

     $content = array(); 
     $keys = $this->escape_string($keys_values); 

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

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

    function escape_string($data){ 
     $result = array(); 
     foreach($data as $row){ 
      $result[] = str_replace('"', '',$row); 
     } 
     return $result; 
    } 
} 
?> 

und Controller-Methode

function readExcel() 
{ 
     $this->load->library('csvreader'); 
     $result = $this->csvreader->parse_file('Test.csv'); 

     $data['csvData'] = $result; 
     $this->load->view('view_csv', $data); 
} 

Und dies ist eine Ansicht

<table cellpadding="0" cellspacing="0" width="100%"> 
    <tr> 
      <td width = "10%">ID</td> 
      <td width = "20%">NAME</td> 
      <td width = "20%">SHORT DESCRIPTION</td> 
      <td width = "30%">LONG DESCRIPTION</td> 
      <td width = "10%">STATUS</td> 
      <td width = "10%">PARENTID</td> 
    </tr> 

      <?php foreach($csvData as $field){?> 
       <tr> 
        <td><?php echo $field['id']?></td> 
        <td><?php echo $field['name']?></td> 
        <td><?php echo $field['shortdesc']?></td> 
        <td><?php echo $field['longdesc']?></td> 
        <td><?php echo $field['status']?></td> 
        <td><?php echo $field['parentid']?></td> 
       </tr> 
      <?php }?> 
</table> 

Referenz Here

+0

Thx Raheel, hast du das implementiert, um csv in die Datenbank einzugeben? –

+0

ja übergeben Sie einfach das '$ result' an die Datenbanktabelle oder bilden Sie ein Array nach Ihren Anforderungen. –

3

Dies ist eine verbesserte Version des raheel des shan akzeptierte Antwort - ich bearbeitet seine Antwort, aber meine bearbeiten wurde abgelehnt, aber es ist eine wichtige Änderung ist ...

Wenn jede Datenreihe Parsen es nicht klug ist explode() zu verwenden auf das Komma, da es keine mit Zitaten umhüllten Strings behandelt, die Kommas enthalten. Explode bricht diese Zeichenfolgen in Teilstrings und gibt zusätzliche Array-Elemente in $values, so dass diese Prüfung fehlschlägt:

if (count($keys) == count($values)) { 

Stattdessen hat PHP eine speziell gebaute Methode, dies zu handhaben; str_getcsv(). Ich habe den ursprünglichen Antwortcode entsprechend aktualisiert.

Die CSV-Reader-Bibliothek:

<?php 
if (!defined('BASEPATH')) 
    exit('No direct script access allowed'); 

class CSVReader { 

    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); 
     return $content; 
    } 

} 
?> 

Controller-Methode:

function readExcel() { 
    $this->load->library('csvreader'); 
    $result = $this->csvreader->parse_file('Test.csv'); 
    $data['csvData'] = $result; 
    $this->load->view('view_csv', $data); 
} 

Und dies ist die Ansicht:

<table cellpadding="0" cellspacing="0" width="100%"> 
    <tr> 
     <td width="10%">ID</td> 
     <td width="20%">NAME</td> 
     <td width="20%">SHORT DESCRIPTION</td> 
     <td width="30%">LONG DESCRIPTION</td> 
     <td width="10%">STATUS</td> 
     <td width="10%">PARENTID</td> 
    </tr> 
    <?php foreach ($csvData as $field) { ?> 
     <tr> 
      <td><?php echo $field['id'] ?></td> 
      <td><?php echo $field['name'] ?></td> 
      <td><?php echo $field['shortdesc'] ?></td> 
      <td><?php echo $field['longdesc'] ?></td> 
      <td><?php echo $field['status'] ?></td> 
      <td><?php echo $field['parentid'] ?></td> 
     </tr> 
    <?php } ?> 
</table> 
2

Nun stört mich nicht, ich ist gerade geändert ajmedway Bibliothek, um Delimiter aufzunehmen, nur für den Fall, dass Sie Daten von zB TSV- oder Pipe-Dateien erhalten möchten. Wenn Sie einfache alte CSV wollen, ist es in Ordnung.

class CSVReader { 

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, $delimiter = FALSE) { 

    $file = fopen($p_Filepath, 'r'); 
    $this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure); 
    if ($delimiter==FALSE) 
    { 
    $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++; 
      } 
     } 
    } 
    } 
    else{ 
     $keys = str_getcsv($this->fields[0],$delimiter); 

     $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],$delimiter); 
       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); 
    return $content; 
}}?> 
+0

Dies ist falsch wenn ($ delimiter = FALSE), da Sie $ delimiter auf FALSE setzen und seinen Status nicht überprüfen. Es sollte sein, wenn ($ delimiter == FALSE) – Johnish

+0

whoops! Es tut uns leid. Anfängerfehler. Danke @Johnish. Ich werde es sofort korrigieren. –

0

Dies ist eine verbesserte Version für leere Zeilen und zusätzliche Leerzeichen und Tabulatoren ...

Klasse CSVReader {

function csv_to_array($Filepath) 
{ 
    //Get csv file content 
    $csvData = file_get_contents($Filepath); 

    //Remove empty lines 
    $csvData = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\r\n", $csvData); 

    //String convert in array formate and remove double quote(") 
    $array = array(); 
    $array = $this->escape_string(preg_split('/\r\n|\r|\n/', $csvData)); 
    $new_content_in_array = array(); 
    if($array) 
    { 
     //Get array key 
     $array_keys = array(); 
     $array_keys = array_filter(array_map('trim', explode(';',$array[0]))); 

     //Get array value 
     $array_values = array(); 
     for ($i=1;$i<count($array);$i++) 
     { 
      if($array[$i]) 
      { 
       $array_values[] = array_filter(array_map('trim', explode(';',$array[$i]))); 
      } 
     } 

     //Convert in associative array 
     if($array_keys && $array_values) 
     { 
      $assoc_array = array(); 
      foreach ($array_values as $ky => $val) 
      {   
       for($j=0;$j<count($array_keys);$j++){ 
        if($array_keys[$j] != "" && $val[$j] != "" && (count($array_keys) == count($val))) 
        { 
         $assoc_array[$array_keys[$j]] = $val[$j]; 
        } 
       } 
       $new_content_in_array[] = $assoc_array; 
      } 
     } 
    } 
    return $new_content_in_array; 
} 

function escape_string($data){ 
    $result = array(); 
    foreach($data as $row){ 
     $result[] = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "", str_replace('"', '',$row)); 
    } 
    return $result; 
} 

} >

-1

Aufruf im Controller:

$this->load->library('csvreader'); 
$import_csv_data = $this->csvreader->csv_to_array($path); 
print_r($import_csv_data); 
exit; 
Verwandte Themen