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): ストリームを開けませんでした: そのようなファイルまたはディレクトリはありません

ファイル名: libraries/csvreader.php

誰でも私を助けてくれませんか!!!

4

3 に答える 3

0

最初にCSVファイルをサーバーにアップロードするというコメントに基づいて、CSVフィールド/ヘッダーがデータベーステーブルフィールドの1つと一致するかどうかを確認して、行を挿入します。ここで作成したサンプルコードは次のとおりです。

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

このライブラリを使用して、配列を他のデータ形式に変換したり、その逆を行ったりします。

CI - レストサーバー

そこには、CSV を配列に変換してデータベースに保存するために使用できるライブラリ/クラス フォーマット (Format.php) があります。このクラスは他のフォーマットもサポートしています:

  • xml – ほぼすべてのプログラミング言語が XML を読み取ることができます
  • json – JavaScript や、ますます増えている PHP アプリに役立ちます。
  • csv – スプレッドシート プログラムで開く
  • html – シンプルな HTML テーブル
  • php – eval() できる PHP コードの表現
  • serialize – PHP で非シリアル化できるシリアル化されたデータ

編集:

このライブラリは、各行に区切り文字「\n」、各列に「,」を使用して CSV で動作し、次のように使用できます。

$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 に答える