Créer une table de base de données à partir de CSV

15

Je travaille sur un module qui nécessite l'accès à certaines données tabulaires fournies par une source externe. Il ne s'agit que de deux colonnes mais compte environ 40000 lignes.

Actuellement, mon module analyse simplement le CSV dans son intégralité lorsque cela est nécessaire. Cela fonctionne bien, mais comme le fichier fait environ 450 Ko, cela consommera des ressources serveur une fois déployé sur un site de production.

Je voudrais déplacer ces données vers une table Magento et j'ai des problèmes.

J'utilise les méthodes RDBMS dans mon script d'installation, ala:

$installer = $this;
$installer->startSetup();

$table = $installer->getConnection()
    ->newTable($installer->getTable('my_table'))
    ->addColumn('column_a', Varien_Db_Ddl_Table::TYPE_TEXT, 5, array(
        'nullable' => false,
        ), 'Column A')
    ->addColumn('column_b', Varien_Db_Ddl_Table::TYPE_TEXT, 3, array(
        'nullable' => false,
        ), 'Column B');

$installer->getConnection()->createTable($table);

$installer->endSetup();

Cela fonctionne très bien pour créer ma table, mais en fait, obtenir mes données me fait mal à la tête (je suis toujours un noob en matière de gestion de base de données).

Idéalement, je voudrais simplement analyser mon fichier CSV et insérer des valeurs dans le tableau sans avoir à faire face à un tas de copier / coller.

Existe-t-il des méthodes intégrées pour gérer les données CSV arbitraires, ou sont-elles toutes conçues pour gérer exactement ce dont elles ont besoin? Quelle serait la meilleure approche pour importer mes données dans Magento?

pspahn
la source

Réponses:

15

Jamais fait ça. Jouons!

Après l' createTable()appel ou dans un script suivant:

/* @var $installer Mage_Core_Model_Resource_Setup */
$installer = $this;
$installer->startSetup();

//Extract data from CSV file
$csv = new Varien_File_Csv;
$data = $csv->getData('path/to/file.csv');

$resultNum = $installer->getConnection()->insertArray(
    $installer->getTable({TABLE NAME}),
    array({COL 1},{COL 2}),    //column names
    $data
);

//EDIT: if this is done using a data setup script, can even log the results:
Mage::log(
    __FILE__." added $resultNum records to $installer->getTable({TABLE NAME})",
    Zend_Log::INFO,
    "setup.log",
    true
);

$installer->endSetup();
Benmarks
la source
wow je ne m'attendais pas à ce que ce soit si facile! :) J'espère que cela fonctionne
Fabian Blechschmidt
Ajusté pour montrer comment enregistrer les résultats, ce qui nécessite un script de configuration des données.
benmarks
Varien_File_Csv, je savais que ça devait être quelque part. Je vais essayer et mettre à jour les résultats.
pspahn
Si brillamment simple. Tu viens de faire mon samedi. Merci @benmarks.
pspahn
2
Il convient également de noter ici que dans ma situation, Magento manquait de mémoire lorsque j'ai ajouté des colonnes supplémentaires. Deux colonnes de données étaient correctes (à peine) et dès que j'ai ajouté une troisième colonne et exécuté le script de mise à niveau, Magento échouait simplement avec une page blanche et aucun message / journal d'erreur. J'ai été forcé de diviser mon CSV en plusieurs fichiers pour le faire fonctionner.
pspahn