Mysql 如何使用codeigniter框架在jquery中读取csv文件

Mysql 如何使用codeigniter框架在jquery中读取csv文件,mysql,codeigniter,csv,Mysql,Codeigniter,Csv,假设这是我的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,DD1AmountC

假设这是我的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" />
我的图书馆

<?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错误

严重性:警告

消息:fopenexport 1.csv:无法打开流:没有此类文件或目录

文件名:libraries/csvreader.php


有人能帮我吗

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

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

xml–几乎任何编程语言都可以读取xml json–适用于JavaScript和越来越多的PHP应用程序。 csv–使用电子表格程序打开 html–一个简单的html表 php–可以评估的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"

根据您的评论,您实际上希望首先将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;
    }
}

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

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

Array
(
    [0] => Array
        (
            [Years] => 1888
            [Make1] => Acura
            [Make2] => Honda
            [Make] => Honda
            [] => Honda
            [Makes] => Toyota
)
Array
(
    [0] => Array
        (
            [Years,Make1,Make2,Make,,Makes,Make] => 1888,Acura,Honda,Toyota,Honda,Toyota,Honda
        )
)
我也在这个位置尝试过CSVReader library。 但它给出的结果数组的值由逗号内爆,如下所示

Array
(
    [0] => Array
        (
            [Years] => 1888
            [Make1] => Acura
            [Make2] => Honda
            [Make] => Honda
            [] => Honda
            [Makes] => Toyota
)
Array
(
    [0] => Array
        (
            [Years,Make1,Make2,Make,,Makes,Make] => 1888,Acura,Honda,Toyota,Honda,Toyota,Honda
        )
)
现在,在您的CSVReader函数中,我已经对CSV文件的第一行名称进行了更改,末尾带有空格。但在此之后,在CI控制器中,当我使用array_key_exists'column_name'、$csvdata检查CSV文件中是否存在字段/标题/列_name时,它返回false/none,因为列_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
    }
 }

你试过谷歌吗。有一个好的source@webghost你的代码在哪里,在你上面的问题中吗?您的CSV示例很难转换,因为每行的分隔符都是空格。请查看我的CSV示例。@SubRedi已编辑了上面的代码,,。您能看一下吗,…,如果我在哪一部分出错了。,,。你能修改我的代码吗,,。排除了上面的示例csv,。。请看我编辑的帖子,,。三硝基甲苯advance@webghost很抱歉迟了答复。根据您编辑的问题,您不能直接从$file=$this->input->post'file'读取文件;因为它尚未保存在您的服务器上。您需要先将文件上载到服务器,然后使用csvreader库开始读取。我建议您首先在服务器上创建虚拟CSV文件,而不上载它,以查看您的CSV读取器是否如您所期望的那样工作。然后,您可以在csv库工作后添加上载功能。如何做到这一点,,。或者您可以给我一些示例代码,说明如何使用codeigniter中的jquery上载csv文件。,,,。请检查我的错误是文件必须上载的路径。,,。我的配置文件是。,.$config['base\u url']=localhost/myhr;,。,。上传路径是什么?我的是$config['upload_path']='./uploads/';我已经创建了文件夹上载。,。我收到一个错误,上传路径似乎无效@webghost抱歉,对于延迟回复,请尝试将$config['base_url']设置为空,并让CI猜测安装的协议、域和路径。如果您在CI上使用.htaccess mod_rewrite,您还应该将$config['index_page']设置为空白。是的,这可以工作,但如何将其集成到我的系统,,。我已经在基本url中说明了我的配置,如何解决这个问题,请帮助,。,tnx@webghost你的问题到底是什么?已经有您的示例代码。你试过了吗?我的意思是样品不能直接满足你的需要,你必须在那里做一些调整。
Array
(
    [0] => Array
        (
            [Years,Make1,Make2,Make,,Makes,Make] => 1888,Acura,Honda,Toyota,Honda,Toyota,Honda
        )
)
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
    }
 }