【问题标题】:CSV Import Library for CodeIgniter [closed]CodeIgniter 的 CSV 导入库 [关闭]
【发布时间】:2013-03-16 07:35:25
【问题描述】:

需要在使用 CodeIgniter 创建的应用程序中实现 csv 或 xls 导入。有没有这方面的图书馆?任何建议表示赞赏。

【问题讨论】:

    标签: php csv codeigniter-2 helper xls


    【解决方案1】:

    这是一个简单的方法来做到这一点。我不知道人们在做什么,但我用这个

    这是我的 csv 阅读器库

    <?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;
        }   
    }
    ?> 
    

    和控制器方法

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

    这是视图

    <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>
    

    参考Here

    【讨论】:

    • Thx Raheel,您是否也实现了此功能以将 csv 输入数据库?
    • 是的,只需将$result 传递给数据库表或根据您的要求形成一个数组。
    • 仍然工作得很好。非常感谢。
    • @MuhammadRaheel 你分配了这一行 $this->csvreader->parse_file('Test.csv');我应该在计算机中保存的 csv 文件我已经厌倦了我遇到了这样的错误 Call to a member function parse_file() on null 另一个错误是 Message: Undefined property: Csv_import::$CsvReader
    • @Jack 它清楚地说它是空的。您应该提供有效的路径。对于第二个问题,您确定您已正确加载库。
    【解决方案2】:

    这是 raheel shan 接受的答案的改进版本 - 我编辑了他的答案,但我的编辑被拒绝了,但这是一个重要的变化......

    在解析每个数据行时,在逗号上使用explode() 是不明智的,因为这不会处理包含逗号的引号括起来的字符串。 Explode 将这些字符串分解为子字符串并在$values 中提供额外的数组元素,因此此检查失败:

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

    相反,PHP 有一个专门构建的方法来处理这个问题; str_getcsv()。我已经相应地更新了原始答案代码。

    CSV 阅读器库:

    <?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;
        }
    
    }
    ?>
    

    控制器方法:

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

    这是视图:

    <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>
    

    【讨论】:

      【解决方案3】:

      别介意,我刚刚修改了 ajmedway 的库以包含分隔符,以防万一您想从 TSV 或管道分隔文件中获取数据。如果您想要普通的旧 CSV,他就可以了。

      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;
      }}?>
      

      【讨论】:

      • 如果 ($delimiter=FALSE) 这是错误的,因为您将 $delimiter 设置为 FALSE 而没有检查它的状态。应该是 if ($delimiter == FALSE)
      • 哎呀!对不起。菜鸟失误。谢谢@Johnish。我会马上改正的。
      【解决方案4】:

      这是针对空行和额外空格和制表符的改进版本...

      class 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;
          }   
      }
      

      【讨论】:

        【解决方案5】:

        调用控制器:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-04
          • 1970-01-01
          • 2011-01-16
          • 2013-11-23
          • 1970-01-01
          • 2011-06-16
          相关资源
          最近更新 更多