1

假设这是我的 csv 文件

fileempId,lastName,firstName,middleName,street1,street2,city,state,zip,gender,birthDate,ssn,empStatus,joinDate,workStation,location,custom1,workState,salary,payFrequency,FITWStatus,FITWExemptions,DD1Routing,DD1Account,DD1Amount,DD1AmountCode,DD1Checking,DD2Routing,DD2Account,DD2Amount,DD2AmountCode,DD2Checking
1,Dela Cruz,Juano,Santos,,,,,,1,,,Part Time Internship,, asd Division, Makati,one, asd,150,Bi Weekly,Not Applicable,100,,,,,,1234,9876,100,SAVINGS,BLANK
3,Palogan,Ralph,,,,,,,1,11-Mar-11,,Full Time Contract,2-Mar-11, sdf Department, pasay,, ,,,Not Applicable,,,,,,,,,,, 5,San,Goku,,,,hidden leaf,,,1,11-Mar-11,,,,,,,,,,Not Applicable,0,,,,,,,,,,

这是我的表格

<label>Choose File:</label><font color="#FF0000">*</font>
<input type="file" name="file" id="file" />
<input type="button" id="importButton" value="Import" name="importButton" />

如何读取csv中的数据并将其存储到mysql数据库(codeigniter)?有关如何执行此操作的任何示例代码,。

请在下面查看我的代码有什么问题,..,

我的视图页面包含 jquery 和表单,,。

<td><label>Choose File:</label><font color="#FF0000">*</font></td>
       <td><input type="file" name="file" id="file" /></td>
         <td><label>Import Type </label><font color="#FF0000">*</font></td>
         <td><select name="importname" id="importname" style="width:130px;">
                 <option value="" selected>--Select--</option>
                 <?php 
                       foreach($fields as $data){
                            print '<option value="'.$data->import_id.'">'.$data->name.'</option>';
                       }
                 ?>
             </select></td>

<script type="text/javascript">
    $(function() {
        $("#importData").click(function(e) {
            var file = $('#file').val();
            var type = $('#importname').val();
            $.post("<?php print base_url().'index.php/MyController/readExcel'?>",{file: file, type: type},
                function(data)
                        {
                        if(data!='success')
                        {
                            error_message(data);    

                        }
                        else{
                            alert("Upload Succcessfull!");
                        }
            });

               });
});

</script>

我的控制器

function readExcel(){
    $file=$this->input->post('file');
    $type=$this->input->post('type');
    $this->load->library('csvreader');
    $result =   $this->csvreader->parse_file($file);

    $data['csvData'] =  $result;
    $this->load->view('MyViews/showImportFile', $data);  

}

我的图书馆

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

}

我收到一个错误

遇到 PHP 错误

严重性:警告

消息:fopen(export 1.csv):无法打开流:没有这样的文件或目录

文件名:库/csvreader.php

有人可以帮我吗!!!

4

3 回答 3

0

我使用这个库将数组转换为其他数据格式,反之亦然。

CI - 休息服务器

在那里您可以找到库/类格式 (Format.php),您可以使用它来将 CSV 转换为数组,然后将其保存到您的数据库中。该类还支持其他格式:

  • xml——几乎任何编程语言都可以读取 XML
  • json – 适用于 JavaScript 和越来越多的 PHP 应用程序。
  • csv – 使用电子表格程序打开
  • html – 一个简单的 HTML 表格
  • php – 可以被 eval()'ed 的 PHP 代码的表示
  • serialize – 可以在 PHP 中反序列化的序列化数据

编辑:

该库适用于 CSV,每行带有分隔符“\n”,每列带有“,”,您可以像这样使用它:

$this->load->library('format');

$string_csv = "YOUR CSV";        
$result = $this->format->factory($string_csv, 'csv')->to_array();

var_dump($result);

就这么简单。但是,正如我上面所说,如果您有另一个分隔符,那么您必须根据需要调整库。这里是将 CSV 转换为数组的主要函数:

function _from_csv($string)
{
    $data = array();

    // Splits
    $rows = explode("\n", trim($string));
    $headings = explode(',', array_shift($rows));
    foreach ($rows as $row)
    {
        // The substr removes " from start and end
        $data_fields = explode('","', trim(substr($row, 1, -1)));

        if (count($data_fields) == count($headings))
        {
            $data[] = array_combine($headings, $data_fields);
        }
    }

    return $data;
}

编辑2:

我的示例将适用于这种标准的 CSV 格式:

Heading1, Heading2, Heading3
"1","John","London"
"2","Brian","Texas"
于 2012-12-04T05:01:59.737 回答
0

根据您实际上要先将 CSV 文件上传到服务器的评论,然后检查 CSV 字段/标题是否与您的数据库表字段之一匹配以插入行,这里是我制作的示例代码:

CSV 阅读器(基于此并进行了一些调整):

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* CSVReader Class
*
* $Id: csvreader.php 147 2007-07-09 23:12:45Z Pierre-Jean $
*
* Allows to retrieve a CSV file content as a two dimensional array.
* The first text line shall contains the column names.
*
* @author        Pierre-Jean Turpeau
* @link        http://www.codeigniter.com/wiki/CSVReader
*/
class CSVReader {

    var $fields;        /** columns names retrieved after parsing */
    var $separator = ',';    /** separator used to explode each line */

    /**
     * Parse a text containing CSV formatted data.
     *
     * @access    public
     * @param    string
     * @return    array
     */
    function parse_text($p_Text) {
        $lines = explode("\n", $p_Text);
        return $this->parse_lines($lines);
    }

    /**
     * Parse a file containing CSV formatted data.
     *
     * @access    public
     * @param    string
     * @return    array
     */
    function parse_file($p_Filepath) {
        $lines = file($p_Filepath);
        return $this->parse_lines($lines);
    }
    /**
     * Parse an array of text lines containing CSV formatted data.
     *
     * @access    public
     * @param    array
     * @return    array
     */
    function parse_lines($p_CSVLines) {    
        $content = FALSE;
        foreach( $p_CSVLines as $line_num => $line ) {                        
            if( $line != '' ) { // skip empty lines
                $line = trim($line);

                $elements = explode($this->separator, $line);

                if( !is_array($content) ) { // the first line contains fields names
                    $this->fields = $elements;
                    $content = array();
                } else {
                    $item = array();
                    foreach( $this->fields as $id => $field ) {
                        if( isset($elements[$id]) ) {
                            $item[$field] = $elements[$id];
                        }
                    }
                    $content[] = $item;
                }
            }
        }
        return $content;
    }

    /**
     * Get fields
     */
    public function get_fields(){
        return $this->fields;
    }
}

在 CI 上执行上传处理程序:

public function do_upload()
{
    $config['upload_path'] = './uploads/';
    $config['allowed_types'] = 'csv';
    $config['max_size'] = '100';
    $config['max_width']  = '1024';
    $config['max_height']  = '768';

    $this->load->library('upload', $config);

    if ( ! $this->upload->do_upload('csvfile'))
    {
        $error = array('error' => $this->upload->display_errors());
        $this->load->view('csv_upload', $error);
    }
    else
    {
        $upload_data = $this->upload->data();

        // start to read the CSV file
        $this->load->library('csvreader');
        $file_path = $upload_data['full_path'];

        $csv_data = $this->csvreader->parse_file($file_path); 
        $csv_fields = $this->csvreader->get_fields();

        // list your database table
        $tables = $this->db->list_tables();
        foreach($tables as $table)
        {
            $fields = $this->db->list_fields($table);

            if($fields == $csv_fields) // match to one of database table
            {
                // insert the record
                foreach($csv_data as $row){                        
                    $this->db->insert($table, $row);
                }
            }
        }

        $data = array(
            'upload_data' => $upload_data,
            'csv_data' => $csv_data,
        );

        $this->load->view('upload_success', $data);
    }
}

在此处下载完整示例。您可以在文件夹中找到 CSV 文件的样本uploads

于 2012-12-06T05:04:44.267 回答
0

我已经尝试过您的 CSVReader 功能。根据我的需要,它给了我完美的结果。我也喜欢您检查 CSV 字段/标题是否与您的数据库表字段之一匹配以插入行的想法。它给出了如下的结果数组。

Array
(
    [0] => Array
        (
            [Years] => 1888
            [Make1] => Acura
            [Make2] => Honda
            [Make] => Honda
            [] => Honda
            [Makes] => Toyota
)

我也在这个位置尝试了 CSVReader 库。 https://github.com/bcit-ci/CodeIgniter/wiki/CSVReader 但它给出了结果数组,其值由逗号(,)内爆,如下所示。

Array
(
    [0] => Array
        (
            [Years,Make1,Make2,Make,,Makes,Make] => 1888,Acura,Honda,Toyota,Honda,Toyota,Honda
        )
)

现在 SubRed,在您的 CSVReader 函数中,我对 CSV 文件的第一行名称进行了更改,最后带有空格。但在那之后,在 CI 控制器中,当我检查 CSV 文件中是否存在 fields/headers/column_name 时,它​​返回 false/none,因为最后字段中array_key_exists('column_name',$csvdata)有空格。column_name所以我更新了你的代码。

请参考下面更新的代码,如果有任何建议,请给我。

编辑:- 更改 CSVReader 文件中 parse_lines 函数中的 foreach 循环 =>

foreach( $this->fields as $id => $field ) {  
    //echo $id;
    //echo $field;
    //In CSV File, trim(remove both end whitespaces) the first line which contains fields names
    $field = trim($field);
    if( isset($elements[$id]) ) 
    {
        $item[trim($field)] = trim($elements[$id]);//In CSV File, trim all the file data
    }
 }
于 2018-10-19T17:20:33.650 回答