Crear tabla de base de datos desde CSV

15

Estoy trabajando en un módulo que requiere acceso a algunos datos tabulares proporcionados por una fuente externa. Son solo dos columnas pero tiene aproximadamente 40000 filas.

Actualmente, mi módulo solo analiza el CSV en su totalidad cuando es necesario. Esto funciona bien, pero dado que el archivo es de aproximadamente 450 Kb, consumirá recursos del servidor una vez implementado en un sitio de producción.

Me gustaría mover estos datos a una tabla de Magento y estoy teniendo problemas.

Estoy usando los métodos RDBMS en mi script de configuración, 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();

Esto funciona bien para crear mi tabla, pero en realidad ingresar mis datos me está destrozando la cabeza (todavía soy un novato en lo que respecta a la gestión de bases de datos).

Idealmente, simplemente analizaría mi archivo CSV e insertaría valores en la tabla sin tener que lidiar con un montón de copiar / pegar.

¿Hay algún método incorporado para manejar datos CSV arbitrarios, o están todos diseñados para manejar justo lo que necesitan? ¿Cuál sería el mejor enfoque para ingresar mis datos en Magento?

pspahn
fuente

Respuestas:

15

Nunca hice esto. ¡Vamos a jugar!

Después de la createTable()llamada, o en un script posterior:

/* @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();
puntos de referencia
fuente
wow, no esperaba, que esto podría ser tan fácil! :) Espero que esto funcione
Fabian Blechschmidt
Ajustado para mostrar cómo registrar resultados, lo que requiere un script de configuración de datos.
Benmarks
Varien_File_Csv, sabía que tenía que estar allí en alguna parte. Le daré una oportunidad y lo actualizaré con los resultados.
pspahn el
Tan brillantemente simple. Acabas de hacer mi sábado. Gracias @benmarks.
pspahn
2
También vale la pena señalar aquí que, en mi situación, Magento se estaba quedando sin memoria cuando agregué columnas adicionales. Dos columnas de datos estaban bien (apenas) y tan pronto como agregué una tercera columna y ejecuté el script de actualización, Magento simplemente fallaba con una página en blanco y sin mensajes de error / registros. Me vi obligado a dividir mi CSV en varios archivos para que funcione.
pspahn