Laravel-excel: Délimiteur CSV

Créé le 15 oct. 2014  ·  26Commentaires  ·  Source: Maatwebsite/Laravel-Excel

Lors de la création d'une classe personnalisée :

class CSVExcel  extends Excel {
    protected $delimiter  = ';';
}

Et en utilisant :

 CSVExcel::load('file.csv')->export('xls');

le réglage du délimiteur n'est pas respecté

Commentaire le plus utile

@yailperalta-santex
Pour utiliser le délimiteur de tabulation dans csv, vous devez le définir comme ceci "\t"
il doit être entre guillemets doubles et non entre guillemets simples
donc la configuration dans config/excel.php sera comme ça
'delimiter' => "\t",

Tous les 26 commentaires

Vous mélangez deux choses : les injections de fichiers et les façades.

Vous étendez la classe facade, qui n'a pas la propriété $delimiter.

Ce que vous voulez faire, c'est quelque chose comme :

class MyOwnFile extends ExcelFile {

    protected $delimiter = ';';

    public function getFile()
    {
        return storage_path('exports') . '/file.csv';
    }

}

class ExampleController {

    public function __construct(MyOwnFile $file)
    {
        $this->file = $file;
    }

    public function import()
    {
        // if using fileHandlers:
        $this->file->handleImport();

       // If you want to fetch inside the controller (which I wouldn't recommend)
       $this->file->get();
    }

    // or if you are using Laravel 5.0, you could use the method injection:
    public function import(MyOwnFile $file)
    {
        $file->handleImport();
    }
}

Si les documents prêtaient à confusion à ce sujet, veuillez me le faire savoir ou faire une demande de tirage pour les documents :)

Documents sur les injections de fichiers : http://www.maatwebsite.nl/laravel-excel/docs/import#injection

Comment définir le délimiteur pour CSV à la volée. En fait, j'utilise la fonction "Excel::load" dans mon contrôleur qui étend BaseController. J'ai réussi à charger .XLS, .XLSX et CSV avec le paramètre defsult comme mentionné dans le fichier de configuration csv.php. Mais le problème est que je dois prendre l'entrée utilisateur pour le délimiteur, comme l'entrée peut être Pipesign, Tab, etc. Alors, comment faire cela? S'il vous plaît aider.

Vous pouvez utiliser des méthodes telles que setDelimiter() pour remplacer les paramètres de configuration. Voir : https://github.com/Maatwebsite/Laravel-Excel/blob/master/src/Maatwebsite/Excel/Readers/LaravelExcelReader.php#L271

d'accord. J'ai utilisé :
$resultats = Excel::load('uploads/' . $filename, function($reader) {

                })->setDelimiter("|")->get();

mais il lit toutes les valeurs dans une seule colonne car il n'a pas pris "Pipe Delimiter". S'il vous plaît aider.

J'ai le même problème. Utilisation de Laravel 4. Voici le code de mon contrôleur :

public function uploadData()
{
        $file = Input::file('data')->getRealPath();

        \Excel::load($file, function($reader) {
                echo "<pre>";
                $reader->setDelimiter('|');
                print_r($reader->get());
        });
}

La sortie n'est pas divisée sur le séparateur de tuyaux, mais est plutôt traitée comme une longue chaîne. Voici un exemple :

    Maatwebsite\Excel\Collections\RowCollection Object
(
    [title:protected] => Worksheet
    [items:protected] => Array
        (
            [0] => Maatwebsite\Excel\Collections\CellCollection Object
                (
                    [title:protected] => 
                    [items:protected] => Array
                        (
                            [upc_numberitem_numberqty_availunit_pricedescriptioncolorqty_on_ponext_avail_dt] => 040176424354|53607-3037|0|14.50|PACK-N-GO DUFFELS 20?"|BIRDS ON A WIRE/LEAF GREEN||
                        )

                )

            [1] => Maatwebsite\Excel\Collections\CellCollection Object
                (
                    [title:protected] => 
                    [items:protected] => Array
                        (
                            [upc_numberitem_numberqty_availunit_pricedescriptioncolorqty_on_ponext_avail_dt] => 040176414850|53607-3054|0|14.50|PACK-N-GO DUFFELS 20?"|BLACK/BLACK/BLACK||
                        )

                )
)

Est-ce que je fais quelque chose de mal ici? Pourquoi les lignes ne sont-elles pas analysées sur le caractère pipe ?

Si je modifie le paramètre delimiter dans config/csv.php , le fichier est analysé correctement. Pourquoi cela ne fonctionne-t-il pas avec la méthode setDelimiter() ?

Vous devez modifier le délimiteur avant le chargement du fichier :

Excel::setDelimiter('|')->load(...);

Merci pour l'aide, mais ceci donne maintenant une erreur:

iconv() expects parameter 1 to be string, object given

L'erreur est dans Shared/String.php. Est-ce lié d'une manière ou d'une autre à cela ?

https://github.com/Maatwebsite/Laravel-Excel/issues/382

Et si vous essayiez de le configurer à la volée avec :

Config::set('excel::csv.delimiter, '|');

Cela fonctionne (Laravel 5.1):

Config::set('excel.csv.delimiter', '|');

ok cette façon fonctionne, mais pourquoi cette façon ne fonctionne pas?

Excel::load($file->getPathName(), function($reader){
    $reader->setDelimiter(';')
    dd($reader->get());
});

Parce que le fichier est déjà chargé, il ne peut donc plus être modifié pour le moment.

très bien ... et si j'ai besoin d'importer 2 csv sur la même demande, et un, utilisez ';' comme délimiteur et un autre utilise ',' j'ai besoin d'utiliser Config :: set 2 fois ? il n'y a pas d'autre chemin?

Oui, deux Config::set devraient fonctionner.

La version 3 prendra en charge le changement de délimiteur après le chargement. Mais nous ne sommes pas encore près d'une sortie.

merci beaucoup pour la réponse rapide

J'utilise laravel 4.2, donc le délimiteur par défaut ne sépare pas les colonnes dans le bon sens si l'une des colonnes est vide

Dans Laravel 4, vous pouvez définir le délimiteur à la volée avec ceci :
Config::set('excel::csv.delimiter', '|');

Réf : https://laravel.com/docs/4.2/packages#package -configuration

pourquoi faire override, tout existe dans config/Excel.php

'csv'        => array(
    /*
   |--------------------------------------------------------------------------
   | Delimiter
   |--------------------------------------------------------------------------
   |
   | The default delimiter which will be used to read out a CSV file
   |
   */

    'delimiter'   => ';',

    /*
    |--------------------------------------------------------------------------
    | Enclosure
    |--------------------------------------------------------------------------
    */

    'enclosure'   => '',

    /*
    |--------------------------------------------------------------------------
    | Line endings
    |--------------------------------------------------------------------------
    */

    'line_ending' => "\r\n",

    /*
    |--------------------------------------------------------------------------
    | setUseBom
    |--------------------------------------------------------------------------
    */

    'use_bom' => false
),

définir le délimiteur Au-dessus d'Excel :: charger comme ceci . Son travail pour moi sur laravel 5.3

       Excel::setDelimiter('|');

Excel::load($filename, function ($reader) {

            foreach ($reader->toArray() as $row) {

                 $data[] = $row;
            }
              print_r($data);
        });

@medamineDev config/Excel.php est pour l'usage général. Vous devez remplacer lorsque le système doit traiter des fichiers qui ont un séparateur/délimiteur différent.

Salut, comment paramétrer le délimiteur tabulateur ?

Essayez /t

@jediscript Merci mais /t ne fonctionne pas, dit que le délimiteur doit être 1 caractère.

@yailperalta-santex quel problème essayez-vous de résoudre avec cette bibliothèque ? Vous pouvez peut-être utiliser http://php.net/manual/en/function.fgetcsv.php à la place.

@yailperalta-santex
Pour utiliser le délimiteur de tabulation dans csv, vous devez le définir comme ceci "\t"
il doit être entre guillemets doubles et non entre guillemets simples
donc la configuration dans config/excel.php sera comme ça
'delimiter' => "\t",

$data = Excel::setDelimiter("t")->load(storage_path().'/uploads/imports/data.csv')->get();

Cette page vous a été utile?
0 / 5 - 0 notes