Avatar billede lefsa62 Seniormester
28. august 2019 - 12:32 Der er 14 kommentarer

Csv uploade til codelnigter

Vedr codelnigter upload af csv fejler med æ ø å
Avatar billede ejvindh Ekspert
02. september 2019 - 15:52 #1
Det er jo ikke meget, du giver os at arbejde med. Men umiddelbart lyder det som et problem omkring encoding. Altså: skriver du den pågældende fil med den samme encoding, som du læser den med? Og skriver du filen med den encoding, der svarer til de data, som svarer med til de strenge, du har at gøre med?
Avatar billede lefsa62 Seniormester
02. september 2019 - 16:08 #2
Her kommer min controller.
<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Debcsv extends CI_Controller {
   
    function __construct() {
        parent::__construct();
        $this->is_logged_in();
        // Load member model
        $this->load->model('Debcsv_model');
       
        // Load form validation library
        $this->load->library('form_validation');
       
        // Load file helper
        $this->load->helper('file');
    }
    public function is_logged_in()
    {
        $is_logged_in = $this->session->userdata('is_logged_in');
        if(!isset($is_logged_in) || $is_logged_in != true)
        {
            redirect('login');
        }
    }
    public function index(){
        $data = array();
       
        // Get messages from the session
        if($this->session->userdata('success_msg')){
            $data['success_msg'] = $this->session->userdata('success_msg');
            $this->session->unset_userdata('success_msg');
        }
        if($this->session->userdata('error_msg')){
            $data['error_msg'] = $this->session->userdata('error_msg');
            $this->session->unset_userdata('error_msg');
        }
       
        // Get rows
        $data['debcsv'] = $this->Debcsv_model->getRows();
       
        // Load the list page view
        $this->load->view('templates1/header');
        $this->load->view('debit/debitors/debcsv/index', $data);
    }
   
    public function import(){
        $data = array();
        $memData = array();
       
        // If import request is submitted
        if($this->input->post('importSubmit')){
            // Form field validation rules
            $this->form_validation->set_rules('file', 'CSV file', 'callback_file_check');
           
            // Validate submitted form data
            if($this->form_validation->run() == true){
                $insertCount = $updateCount = $rowCount = $notAddCount = 0;
               
                // If file uploaded
                if(is_uploaded_file($_FILES['file']['tmp_name'])){
                    // Load CSV reader library
                    $this->load->library('CSVReader');
                   
                    // Parse data from CSV file
                    $csvData = $this->csvreader->parse_csv($_FILES['file']['tmp_name']);
                   
                    // Insert/update CSV data into database
                    if(!empty($csvData)){
                        foreach($csvData as $row){ $rowCount++;
                           
                            // Prepare data for DB insertion
                            $memData = array(
                                'phone' => $row['Phone'],
                                'name' => $row['Name'],
                                'adress' => $row['Adress'],
                                'zipcode' => $row['Zipcode'],
                                'city' => $row['City'],
                                'email' => $row['Email'],
                                'year' => $row['Year'],
                                'days' => $row['Days']
                            );
                           
                            // Check whether email already exists in the database
                            $con = array(
                                'where' => array(
                                    'email' => $row['Email']
                                ),
                                'returnType' => 'count'
                            );
                            $prevCount = $this->Debcsv_model->getRows($con);
                           
                            if($prevCount > 0){
                                // Update member data
                                $condition = array('email' => $row['Email']);
                                $update = $this->Debcsv_model->update($memData, $condition);
                               
                                if($update){
                                    $updateCount++;
                                }
                            }else{
                                // Insert member data
                                $insert = $this->Debcsv_model->insert($memData);
                               
                                if($insert){
                                    $insertCount++;
                                }
                            }
                        }
                       
                        // Status message with imported data count
                        $notAddCount = ($rowCount - ($insertCount + $updateCount));
                        $successMsg = 'Invoice imported successfully. Total Rows ('.$rowCount.') | Inserted ('.$insertCount.') | Updated ('.$updateCount.') | Not Inserted ('.$notAddCount.')';
                        $this->session->set_userdata('success_msg', $successMsg);
                    }
                }else{
                    $this->session->set_userdata('error_msg', 'Error on file upload, please try again.');
                }
            }else{
                $this->session->set_userdata('error_msg', 'Invalid file, please select only CSV file.');
            }
        }
        redirect('be/debcsv');
    }
   
    /*
    * Callback function to check file value and type during validation
    */
    public function file_check($str){
        $allowed_mime_types = array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain');
        if(isset($_FILES['file']['name']) && $_FILES['file']['name'] != ""){
            $mime = get_mime_by_extension($_FILES['file']['name']);
            $fileAr = explode('.', $_FILES['file']['name']);
            $ext = end($fileAr);
            if(($ext == 'csv') && in_array($mime, $allowed_mime_types)){
                return true;
            }else{
                $this->form_validation->set_message('file_check', 'Please select only CSV file to upload.');
                return false;
            }
        }else{
            $this->form_validation->set_message('file_check', 'Please select a CSV file to upload.');
            return false;
        }
    }
}

Kik på den og giv mig et godt bud hvad jeg skal gøre
Avatar billede lefsa62 Seniormester
02. september 2019 - 16:18 #3
Csv filen ser sådan ud.

Starter i excel i colone 1a og skriver overskrifter med KOMMA mellem hver enhed.
Og i kolonne 2a skriver jeg hvad den skal uploade til mysql men KOMMA mellem hver enhed
Avatar billede lefsa62 Seniormester
02. september 2019 - 16:50 #4
Jeg vil lige høre om du havde en løsning på problemet  det et derfor jeg spurgte om hjælp
Avatar billede lefsa62 Seniormester
02. september 2019 - 16:54 #5
Jeg har købt den fra et land som ikke har æøå
De kan ikke klare problemet så jeg er låst
Avatar billede ejvindh Ekspert
02. september 2019 - 21:58 #6
Jeg kan desværre ikke umiddelbart hjælpe dig. Dels har jeg ikke personligt nogen videre erfaring med CI, dels er det også stadig lidt uklart for mig, præcis hvor i processen, det går galt.

Som jeg har forstået det, så ønsker du at importere fra en csv-fil til en mysql-db? Er du sikker på, at databasen er sat til den rette encoding? Prøv evt. at lade dit php-script echo'e de værdier, som den henter fra csv-filen, så kan du se om det går galt allerede i læsningen, eller om det først er når der skrives til Mysql.
Avatar billede ejvindh Ekspert
02. september 2019 - 21:59 #7
Men i øvrigt: Hvis du har købt den et sted fra, så burde det nu også være deres opgave, at få det til at virke... Det burde da uanset hvor man kommer fra være muligt at afprøve internationale tegn i konstruktionen...
Avatar billede lefsa62 Seniormester
02. september 2019 - 22:53 #8
Jeg har heller ikke så meget forstand på . Det er derfor jeg køber pakker og implanterer det i mit system. Det er bare træls jeg ikke kan uploade flere linjer ad gangen  :-((   
Hvis jeg gemmer csv filen i excel som  csv utf-8  (commasepareret ) (.csv) og fjerner telefon nr så læser den alt korrekt  surt sjov
Avatar billede ejvindh Ekspert
03. september 2019 - 10:13 #9
Mit bedste råd til dig ville nok være at sende en datafil til dem, der har lavet pakken, der indeholder de tegn, som ikke virker nu, og så bede dem om at få det til at virke.

I forhold til det sidste du skriver, kan du så bekræfte, at det også virker hvis du gemmer filen som utf8 selvom der er telefonnumre? Hvis ja, så bekræfter det min formodning om, at det er et encoding-issue. Og så tænker jeg at det burde kunne løses forholdsvis simpelt -- fx vha mb_convert_encoding:
https://www.php.net/manual/en/function.mb-convert-encoding.php

Men det afhænger jo lidt af, hvilken encoding, der normalt gemmes i i excel. Det ved jeg simpelthen ikke, men det burde det pågældende softwarehus meget nemt kunne finde ud af.
Avatar billede lefsa62 Seniormester
03. september 2019 - 10:55 #10
De har sagt de kan ikke løse det. Så det er derfor jeg lade ud på computerworld for se om der er en som kan løse det for mig. For det er meget vigtigt at jeg får det løst
Avatar billede MADOlsen Forsker
10. september 2019 - 10:00 #11
#10 Så vil jeg helt sikkert finde et andet sted at købe units henne fremadrettet. For et softwarehus der ikke har styr på encoding, er altså absolut ikke værd at samarbejde med.
Avatar billede lefsa62 Seniormester
10. september 2019 - 11:13 #12
Efter som du har en kommentar MADOlsen har du løsning på det?
Avatar billede ejvindh Ekspert
10. september 2019 - 11:31 #13
En mulighed kunne jo være at holde betalingen tilbage til de får styr på det.

Hvis det er for sent, så tænker jeg, at du kunne afprøve forslaget fra #9. Præcis hvor du skal sætte det ind synes jeg er svært at sige, eftersom du har været lidt upræcis i beskrivelsen af problemet. Men et sted at starte kunne være på brugen af $row-variablen efter "// Prepare data for DB insertion".
Avatar billede MADOlsen Forsker
10. september 2019 - 12:42 #14
#12 Det har jeg ikke nej. Men sådan noget med encoding burde man have styr på efter et af de første semestre på en vilkårlig uddannelse med fokus på softwareudvikling. Så når et firma siger, at man ikke ser sig i stand til at løse sådan et problem, bør der absolut ikke sendes flere penge i deres retning.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester