代码之家  ›  专栏  ›  技术社区  ›  Iain Samuel McLean Elder

如何将CSV文件导入MySQL表

  •  264
  • Iain Samuel McLean Elder  · 技术社区  · 15 年前

    我有一个来自客户机的未规范化事件日志CSV,我正试图将它加载到MySQL表中,这样我就可以重构成一个合理的格式。我创建了一个名为“CSVImport”的表,其中CSV文件的每一列都有一个字段。CSV包含99列,因此这本身就是一项非常艰巨的任务:

    CREATE TABLE 'CSVImport' (id INT);
    ALTER TABLE CSVImport ADD COLUMN Title VARCHAR(256);
    ALTER TABLE CSVImport ADD COLUMN Company VARCHAR(256);
    ALTER TABLE CSVImport ADD COLUMN NumTickets VARCHAR(256);
    ...
    ALTER TABLE CSVImport Date49 ADD COLUMN Date49 VARCHAR(256);
    ALTER TABLE CSVImport Date50 ADD COLUMN Date50 VARCHAR(256);
    

    表上没有约束,所有字段都包含VARCHAR(256)值,但包含counts(用INT表示)、yes/No(用BIT表示)、prices(用DECIMAL表示)和text blurbs(用text表示)的列除外。

    我试图将数据加载到文件中:

    LOAD DATA INFILE '/home/paul/clientdata.csv' INTO TABLE CSVImport;
    Query OK, 2023 rows affected, 65535 warnings (0.08 sec)
    Records: 2023  Deleted: 0  Skipped: 0  Warnings: 198256
    SELECT * FROM CSVImport;
    | NULL             | NULL        | NULL           | NULL | NULL               | 
    ...
    

    整张桌子都摆满了人 NULL .

    我认为问题在于文本blurbs包含不止一行,MySQL正在解析文件,好像每一行对应一个数据库行。我可以毫无问题地将文件加载到OpenOffice中。

    这个客户端数据.csv文件包含2593行和570条记录。第一行包含列名。我认为它是逗号分隔的,而文本显然是用双引号分隔的。

    更新:

    http://dev.mysql.com/doc/refman/5.0/en/load-data.html

    我在报告中加了一些信息 LOAD DATA

    LOAD DATA INFILE "/home/paul/clientdata.csv"
    INTO TABLE CSVImport
    COLUMNS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    ESCAPED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;
    

    但仍然有很多 无效的 记录,而且加载的数据似乎都不在正确的位置。

    18 回复  |  直到 5 年前
        1
  •  138
  •   Franck Dernoncourt    10 年前

    许多图形化的mySQL客户机都有很好的导入对话框。

    我最喜欢的工作是基于Windows的 HeidiSQL . 它提供了一个图形界面来构建 LOAD DATA 命令;您可以稍后以编程方式重新使用它。

    Import textfile

    Screenshot: "Import textfile" dialog

    Tools > Import CSV file :

    enter image description here

        2
  •  202
  •   Bob Stein    8 年前

    mysqlimport 要将表加载到数据库中,请执行以下操作:

    mysqlimport --ignore-lines=1 \
                --fields-terminated-by=, \
                --local -u root \
                -p Database \
                 TableName.csv
    

    我在家里找到的 http://chriseiffel.com/everything-linux/how-to-import-a-large-csv-file-to-mysql/

    要使分隔符成为选项卡,请使用 --fields-terminated-by='\t'

        3
  •  86
  •   DareDevil    11 年前

    我导入200多行的最简单方法是在phpmyadminsql窗口中的命令下面

    我有一个简单的国家表,有两列

    CSV FILE

    LOAD DATA INFILE 'c:/country.csv' 
    INTO TABLE country 
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS
    

    记住一件事,永远不要出现在第二栏,否则您的导入将停止

        4
  •  72
  •   jbrahy    7 年前

    我知道 这个问题很老了

    我用这个方法导入了超过10万条记录( 约5MB )在 0.046秒

    LOAD DATA LOCAL INFILE  
    'c:/temp/some-file.csv'
    INTO TABLE your_awesome_table  
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    (field_1,field_2 , field_3);
    

    LINES TERMINATED BY '\n'
    (field_1,field_2 , field_3);
    

    那么,假设你有 第一行作为标题

    IGNORE 1 ROWS
    

    如果您的文件有一个标题行,这就是它的外观。

    LOAD DATA LOCAL INFILE  
    'c:/temp/some-file.csv'
    INTO TABLE your_awesome_table  
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS
    (field_1,field_2 , field_3);
    
        5
  •  33
  •   Pang Ajmal PraveeN    9 年前

    数据库管理 可以处理CSV导入。步骤如下:

    1. 从CSV中删除标题行(如果有的话),这样文件中就只有数据了。

    2. 转到phpMyAdmin接口。

    3. 在左侧菜单中选择表格。

    4. 浏览到CSV文件。

    5. 选择选项“CSV使用加载数据”。

    6. 按与在数据库表中相同的顺序输入列名。

    7. 单击go按钮,您就完成了。

        6
  •  12
  •   lafncow    11 年前

    manual

    LOAD DATA INFILE 'persondata.txt' INTO TABLE persondata (col1,col2,...);
    

    …因此,在您的示例中,您需要按99列在csv文件中的显示顺序列出它们。

        7
  •  9
  •   Vitaliy Pak    7 年前

    1. 右击“表格”;
    2. 选择csv文件并按照说明操作(也可以使用JSON);

    enter image description here

        8
  •  8
  •   David    8 年前

    试试这个,对我有用

        LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE table_name FIELDS TERMINATED BY ',' ENCLOSED BY '"' IGNORE 1 ROWS;
    

    忽略1行此处忽略包含字段名的第一行。请注意,对于文件名,必须键入文件的绝对路径。

        9
  •  7
  •   user1464271    13 年前

    mysql命令行在导入时容易出现太多问题。以下是您的操作方法:

    • 使用excel编辑标题名称,使其没有空格
    • 另存为.csv
    • 使用免费的Navicat Lite Sql浏览器导入并自动创建一个新表(给它一个名称)
    • 打开新表,为ID插入一个主自动编号列
        10
  •  5
  •   Juan    7 年前

    我看到一些奇怪的东西。用于转义的字符与用于封闭的字符相同。所以引擎不知道当它找到一个“'”时该怎么办,我想这就是为什么什么都不在正确的位置。

    LOAD DATA INFILE "/home/paul/clientdata.csv"
    INTO TABLE CSVImport
    COLUMNS TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 LINES;
    

    除非你分析(手动,可视化,…)你的CSV和找出哪个字符用于转义。有时是“\”。但是如果你没有它,就不要使用它。

        11
  •  4
  •   ruvim José Nobile    7 年前

    另一个解决办法是使用 csvsql 神奇的工具 csvkit 一套。

    用法示例:

    csvsql --db mysql://$user:$password@localhost/$database --insert --tables $tablename  $file
    

    此工具可以自动推断数据类型(默认行为)、创建表并将数据插入已创建的表中。 --overwrite 选项可用于删除已存在的表。 --insert

    安装套件

    pip install csvkit
    

    先决条件: python-dev , libmysqlclient-dev , MySQL-python

    apt-get install python-dev libmysqlclient-dev
    pip install MySQL-python
    
        12
  •  3
  •   Martijn Pieters    6 年前

    示例文件: Overseas_trade_index 数据CSV文件

    步骤:

    1. overseas_trade_index .

    2. SQL查询:

      ( id int not null primary key auto_increment,
      series_reference varchar (60),
      period varchar (60),
      data_value decimal(60,0),
      status varchar (60),
      units varchar (60),
      magnitude int(60),
      subject text(60),
      group text(60),
      series_title_1 varchar (60),
      series_title_2 varchar (60),
      series_title_3 varchar (60),
      series_title_4 varchar (60),
      series_title_5 varchar (60),
       );
      
    3. =>show databases;
      =>use database;
      =>show tables;
      
    4. 请输入此命令将csv数据导入mysql表。

      load data infile '/home/desktop/Documents/overseas.csv' into table trade_index fields terminated by ',' lines terminated by '\n' (series_reference,period,data_value,status,units,magnitude,subject,series_title1,series_title_2,series_title_3,series_title_4,series_title_5);
      
    5. 在sqldatabase上查找海外贸易指数数据:

      select * from trade_index;
      
        13
  •  2
  •   zipzit    11 年前

    如果您使用的是加载了Excel电子表格的windows机器,那么新的mySql插件到Excel是惊人的。甲骨文公司的人在这个软件上做得很好。您可以直接从Excel建立数据库连接。该插件将分析您的数据,并为您设置与数据格式一致的表格。我有一些巨大的csv文件的数据转换。这个工具节省了很多时间。

    http://dev.mysql.com/downloads/windows/excel/

    有了这个插件,您就可以在XL电子表格和在线mySql数据存储之间实现纯粹的交互。

        15
  •  2
  •   Mehdi    6 年前

    我使用mysql工作台做同样的工作。

    1. 创建新架构
    2. 右键单击“表格”并选择“表格数据导入向导”
    3. 给出csv文件路径和表名,最后配置列类型,因为向导会根据它们的值设置默认列类型。

    注意:使用“tail-f[mysqlworkbenchpath]/log/wb*.log”查看mysqlworkbench的日志文件中是否有任何错误

        16
  •  1
  •   Magige Daniel    8 年前

    以下是excel文件屏幕截图示例:

    enter image description here

    另存为并选择.csv。

    如果使用notepad++或任何其他记事本打开,您将拥有如下所示的.csv数据屏幕截图。

    enter image description here

    请确保删除标题并在.csv中与mysql表中一样进行列对齐。 用文件夹名称替换文件夹名称


    'D:/文件夹\u名称/我的文件名.csv' 进入表格邮件 以','结尾的字段

    如果是大数据,你可以喝杯咖啡然后把它装上!。

        17
  •  0
  •   Suwarnakumar Kanapathipillai    9 年前

    $query = <<<EOF
                LOAD DATA LOCAL INFILE '$file'
                 INTO TABLE users
                 FIELDS TERMINATED BY ','
                 LINES TERMINATED BY '\n'
                 IGNORE 1 LINES
                (name,mobile,email)
        EOF;
    if (!$result = mysqli_query($this->db, $query))
       {
            exit(mysqli_error($this->db));
       }
    

    **示例CSV文件数据**

    name,mobile,email
    Christopher Gritton,570-686-3439,ChristopherKGritton@inbound.plus
    Brandon Wilson,541-309-5149,BrandonMWilson@inbound.plus
    Craig White,516-795-8065,CraigJWhite@inbound.plus
    David Whitney,713-214-3966,DavidCWhitney@inbound.plus
    
        18
  •  0
  •   Srikrushna    8 年前

    <?php
        $servername = "localhost";
        $username = "root";
        $password = "";
        $dbname = "bd_dashboard";
        //For create connection
        $conn = new mysqli($servername, $username, $password, $dbname);
    
        $query = "LOAD DATA LOCAL INFILE 
                    'C:/Users/lenovo/Desktop/my_data.csv'
                    INTO TABLE test_tab
                    FIELDS TERMINATED BY ','
                    LINES TERMINATED BY '\n'
                    IGNORE 1 LINES
                    (name,mob)";
        if (!$result = mysqli_query($conn, $query)){
            echo '<script>alert("Oops... Some Error occured.");</script>';
            exit();
                //exit(mysqli_error());
           }else{
            echo '<script>alert("Data Inserted Successfully.");</script>'
           }
        ?>
    
        19
  •  0
  •   Amit Ray    5 年前

    我是怎么做到的:

    1. 创建了一个CSV文件并删除了带有列名的标题行。只保留数据。
    2. 记住为每列指定适当的类型。
    3. 我刚刚选择了导入并进入了导入选项卡。
    4. 令我惊讶的是,所有的数据都成功地导入到了相应的列中。