簡體   English   中英

如何解析每行有多列的csv文件?

[英]How to parse a csv file where each row has multiple columns?

這個有點長,所以我事先表示歉意。

我正在嘗試使用;解析csv文件。 定界符,由於某種原因,它僅解析第一個字符串,然后移至文件中的下一行。 我做了一個print_r($content); break; print_r($content); break; 在最后的Csvimport類中測試數據導入,這就是給我的:

Array ( [1] => Array ( [Key1] => Key1 ) [2] => Array ( [Key2] => Key2 ) ) 1

那是一個問題。 第二個是,當我進入視圖時,它會為$field['key']$field['address']$field['lotno']等的每一行引發錯誤。該鍵,地址,lotno未定義。

這是我的csv文件:

Key1;Address1;LotNo1;Acres1;YrBuilt1;
Key2;Address2;LotNo2;Acres2;YrBuilt2;

這是我的csv導入庫文件:

class Csvimport {

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

    // echo print_r($content); break;
    return $content;
    }
}

這是我的控制器:

$import = './application/imports/unitimport.csv';
$this->load->library('csvimport');
$data['importdata'] = $this->csvimport->parse_file($import);

這是我的觀點:

<?php foreach($importdata as $field): ?>

<tr>

    <td><p><?php echo $field['key'] ?><p></td>

    <td><p><?php echo $field['address'] ?><p></td>

    <td><p><?php echo $field['lotno'] ?><p></td>

    <td><p><?php echo $field['acres'] ?><p></td>

    <td><p><?php echo $field['yrbuilt'] ?><p></td>

</tr>

<?php endforeach ?>

我想念什么?

這是一個古老的問題...但是在這里您可以:

這行:

$this->fields = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure);

將文件的第一行保存到$ this-> fields中的數組。 因此,在這一點上:

$this->fields = array('Key1','Address1','LotNo1','Acres1','YrBuilt1');

在下一行中,當您:

$keys = str_getcsv($this->fields[0]);

str_getcsv()正在解析$this-fields的第一個值並將其轉換為數組。 因此,在這一點上:

$keys = array('Key1');

使用以下行遍歷數據行時,您會重復同樣的錯誤:

$values = str_getcsv($row[0]);

$values僅存儲第一個數據列,因為那是解析的唯一項目。

下面的代碼應該工作:

class Csvimport 
{
    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);

        $content = array();
        $i = 1;
        while (($row = fgetcsv($file, $this->max_row_size, $this->separator, $this->enclosure)) != false) 
        {
            if ($row != null) // skip empty lines
            { 
                for ($j = 0; $j < count($this->fields); $j++) 
                {
                    $content[$i][$this->fields[$j]] = $row[$j];
                }
                $i++;
            }
        }
        fclose($file);
        return $content;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM