Php CodeIgniter的CSV导入库

Php CodeIgniter的CSV导入库,php,csv,codeigniter-2,helper,xls,Php,Csv,Codeigniter 2,Helper,Xls,需要将csv或xls导入到使用CodeIgniter创建的应用程序中。这里有图书馆吗?感谢您的建议。这里有一个简单的方法。我不知道人们做什么,但我用这个 这是我的csv阅读器库 <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class CSVReader { var $fields; /** columns names retrieved after par

需要将csv或xls导入到使用CodeIgniter创建的应用程序中。这里有图书馆吗?感谢您的建议。

这里有一个简单的方法。我不知道人们做什么,但我用这个

这是我的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;
    }   
}
?> 
这就是我们的观点

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

身份证件
名称
简短描述
长描述
地位
父ID

参考资料

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

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

if (count($keys) == count($values)) {
相反,PHP有一个专门构建的方法来处理这个问题。我已相应地更新了原始答案代码

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

}
?>
这是一种观点:

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

身份证件
名称
简短描述
长描述
地位
父ID

别介意,我刚刚修改了ajmedway的库,添加了分隔符,以防您想从TSV或管道分隔文件中获取数据。如果你想要普通的老房子,他的就行了

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;
}}?>
类CSVReader{
var$fields;/**解析后检索的列名称*/
var$separator=';';/**用于分解每行的分隔符*/
变量$enclosure='“;/**用于装饰每个字段的enclosure*/
var$max_row_size=4096;/**用于解码的最大行大小*/
函数parse_file($p_Filepath,$delimiter=FALSE){
$file=fopen($p_Filepath,'r');
$this->fields=fgetcsv($file,$this->max\u row\u size,$this->separator,$this->enclosure);
如果($delimiter==FALSE)
{
$keys=str_getcsv($this->fields[0]);
$i=1;
而($row=fgetcsv($file,$this->max_row_size,$this->separator,$this->enclosure))!=false){
如果($row!=null){//跳过空行
$values=str_getcsv($row[0]);
if(计数($keys)=计数($values)){
$arr=array();
对于($j=0;$jfields[0],$delimiter);
$i=1;
而($row=fgetcsv($file,$this->max_row_size,$this->separator,$this->enclosure))!=false){
如果($row!=null){//跳过空行
$values=str_getcsv($row[0],$delimiter);
if(计数($keys)=计数($values)){
$arr=array();
对于($j=0;$j

这是一个改进版,用于空行、额外空格和制表符

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;
}   
函数csv_到_数组($Filepath)
{
//获取csv文件内容
$csvData=文件获取内容($Filepath);
//删除空行
$csvData=preg_replace(“/(^[\r\n]*.[\r\n]+)[\s\t]*[\r\n]+/”、“\r\n”、$csvData);
//数组格式中的字符串转换并删除双引号(“”)
$array=array();
$array=$this->escape_字符串(preg_split('/\r\n | \r\n/',$csvData));
$new_content_in_array=array();
如果($数组)
{
//获取数组键
$array_keys=array();
$array_keys=array_过滤器(array_映射('trim',分解(';',$array[0]));
//获取数组值
$array_values=array();
对于($i=1;$i$val)
{           
对于($j=0;$j

呼叫控制器:

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

Thx Raheel,您也实现了将csv输入到数据库中吗?是的,只需将
$result
传递到数据库表或根据您的要求形成一个数组。仍然工作得很好。非常感谢。@MuhammadRaheel您分配了这一行$this->csvreader->parse_file('Test.csv');我应该在计算机中使用的csv文件我累了,我得到了一个类似于以下的错误:调用成员函数parse_file(),返回null,另一个错误是消息:Undefined property:csv_import::$CsvReader@Jack它清楚地表明它为空。您应该提供有效的路径。对于第二个问题,您是否确定已正确加载库。如果($delimiter=FALSE)因为您正在将$delimiter设置为FALSE,并且没有检查它的状态。应该是如果($delimiter==FALSE)哇!对不起。新手出错。谢谢@Johnish。我会立即更正它。
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;
}   
$this->load->library('csvreader');
$import_csv_data = $this->csvreader->csv_to_array($path);
print_r($import_csv_data );
exit;