Create mysql table directly from CSV file using the CSV Storage engine?

前端 未结 13 1240
感情败类
感情败类 2020-12-04 10:08

I just learned that MySQL has a native CSV storage engine which stores data in a Comma-Separated-Value file per table.

Is it possible to create a table directly from

相关标签:
13条回答
  • 2020-12-04 11:02

    If you're ok with using Python, Pandas worked great for me (csvsql hanged forever for my case). Something like:

    from sqlalchemy import create_engine
    import pandas as pd
    
    df = pd.read_csv('/PATH/TO/FILE.csv')
    # Optional, set your indexes to get Primary Keys
    df = df.set_index(['COL A', 'COL B'])
    
    engine = create_engine('mysql://user:pass@host/db', echo=False)
    
    df.to_sql(table_name, dwh_engine, index=False)
    

    Also this doesn't solve the "using CSV engine" part which was part of the question but might me useful as well.

    0 讨论(0)
  • 2020-12-04 11:04

    I'm recommended use MySQL Workbench where is import data. Workbench allows the user to create a new table from a file in CSV or JSON format. It handles table schema and data import in just a few clicks through the wizard.

    In MySQL Workbench, use the context menu on table list and click Table Data Import Wizard.

    MySQL Workbench image

    More from the MySQL Workbench 6.5.1 Table Data Export and Import Wizard documentation. Download MySQL Workbench here.

    0 讨论(0)
  • 2020-12-04 11:06

    I adopted the script from shiplu.mokadd.im to fit my needs. Whom it interests:

    #!/bin/bash
    if [ "$#" -lt 2 ]; then
        if [ "$#" -lt 1 ]; then 
            echo "usage: $0 [path to csv file] <table name> > [sql filename]"
            exit 1
        fi
        TABLENAME=$1
    else
        TABLENAME=$2
    fi
    echo "CREATE TABLE $TABLENAME ( "
    FIRSTLINE=$(head -1 $1)
    # convert lowercase characters to uppercase
    FIRSTLINE=$(echo $FIRSTLINE | tr '[:lower:]' '[:upper:]')
    # remove spaces
    FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/ /_/g')
    # add tab char to the beginning of line
    FIRSTLINE=$(echo "\t$FIRSTLINE")
    # add tabs and newline characters
    FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/,/,\\n\\t/g')
    # add VARCHAR
    FIRSTLINE=$(echo $FIRSTLINE | sed -e 's/,/ VARCHAR(255),/g')
    # print out result
    echo -e $FIRSTLINE" VARCHAR(255));"
    
    0 讨论(0)
  • 2020-12-04 11:09

    In addition to the other solutions mentioned Mac users may want to note that SQL Pro has a CSV import option which works fairly well and is flexible - you can change column names, and field types on import. Choose new table otherwise the initial dialogue can appear somewhat disheartening.

    Sequel Pro - database management application for working with MySQL databases.

    0 讨论(0)
  • 2020-12-04 11:09

    I have made a Windows command line tool that do just that.

    You can download it here: http://commandline.dk/csv2ddl.htm

    Usage:

    C:\Temp>csv2ddl.exe mysql test.csv test.sql
    

    Or

    C:\Temp>csv2ddl.exe mysql advanced doublequote comma test.csv test.sql
    
    0 讨论(0)
  • 2020-12-04 11:10

    If someone is looking for a PHP solution see "PHP_MySQL_wrapper":

    $db = new MySQL_wrapper(MySQL_HOST, MySQL_USER, MySQL_PASS, MySQL_DB);
    $db->connect(); 
    
    // this sample gets column names from first row of file
    //$db->createTableFromCSV('test_files/countrylist.csv', 'csv_to_table_test');
    
    // this sample generates column names 
    $db->createTableFromCSV('test_files/countrylist1.csv', 'csv_to_table_test_no_column_names', ',', '"', '\\', 0, array(), 'generate', '\r\n');
    
    /** Create table from CSV file and imports CSV data to Table with possibility to update rows while import.
     * @param   string      $file           - CSV File path
     * @param   string      $table          - Table name
     * @param   string      $delimiter      - COLUMNS TERMINATED BY (Default: ',')
     * @param   string      $enclosure      - OPTIONALLY ENCLOSED BY (Default: '"')
     * @param   string      $escape         - ESCAPED BY (Default: '\')
     * @param   integer     $ignore         - Number of ignored rows (Default: 1)
     * @param   array       $update         - If row fields needed to be updated eg date format or increment (SQL format only @FIELD is variable with content of that field in CSV row) $update = array('SOME_DATE' => 'STR_TO_DATE(@SOME_DATE, "%d/%m/%Y")', 'SOME_INCREMENT' => '@SOME_INCREMENT + 1')
     * @param   string      $getColumnsFrom - Get Columns Names from (file or generate) - this is important if there is update while inserting (Default: file)
     * @param   string      $newLine        - New line delimiter (Default: \n)
     * @return  number of inserted rows or false
     */
    // function createTableFromCSV($file, $table, $delimiter = ',', $enclosure = '"', $escape = '\\', $ignore = 1, $update = array(), $getColumnsFrom = 'file', $newLine = '\r\n')
    
    $db->close();
    
    0 讨论(0)
提交回复
热议问题