【问题标题】:How to import data from text file to mysql database如何将文本文件中的数据导入mysql数据库
【发布时间】:2012-11-14 19:30:39
【问题描述】:

我有一个名为 text_file.txt 的 350MB 文件,其中包含此制表符分隔的数据:

345868230   1646198120  1531283146  Keyword_1531283146  1.55    252910000
745345566   1646198120  1539847239  another_1531276364  2.75    987831000
...

MySQL 数据库名称:Xml_Date

数据库表:PerformanceReport

我已经创建了包含所有目标字段的表。

我想将此文本文件数据导入 MySQL。我用谷歌搜索了一些命令,比如LOAD DATA INFILE,对如何使用它感到很困惑。

如何导入此文本文件数据?

【问题讨论】:

    标签: mysql import text-files


    【解决方案1】:
    1. 确保您的 Local-Infile 变量设置为 True (ON)

      mysql> show global variables like 'local_infile';
      +---------------+-------+
      | Variable_name | Value |
      +---------------+-------+
      | local_infile  | OFF   |
      +---------------+-------+
      1 row in set (0.04 sec)
      
      mysql> set global local_infile=true;
      Query OK, 0 rows affected (0.01 sec)
      
    2. 找到正确的路径来存储用于加载到 SQL 表中的 txt 文件

      mysql>  SELECT @@GLOBAL.secure_file_priv;
      +------------------------------------------------+
      | @@GLOBAL.secure_file_priv                      |
      +------------------------------------------------+
      | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ |
      +------------------------------------------------+
      1 row in set (0.00 sec)
      
    3. 使用路径中的数据 infile 加载(在路径中使用反斜杠)

    mysql>  load data infile 'C:/ProgramData/MySQL/MySQL Server
    8.0/Uploads/text_file.txt' into table TABLE_NAME fields terminated by '\t' lines terminated by '\n';
    

    【讨论】:

      【解决方案2】:

      对我来说,只需添加“LOCAL”关键字就可以了,请查看附件图片以获得更简单的解决方案。

      我附上的图片包含两个用例:

      (a) 我在哪里得到这个错误。 (b) 只需添加“Local”关键字即可解决错误。

      【讨论】:

        【解决方案3】:
        LOAD DATA INFILE '/home/userlap/data2/worldcitiespop.txt' INTO TABLE cc FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;
        
        • IGNORE 1 LINES 跳过包含列名的初始标题行
        • FIELDS TERMINATED BY ',' 是读取逗号分隔的文件
        • 如果您在 Windows 系统上生成了文本文件,则可能必须使用 LINES TERMINATED BY '\r\n' 来正确读取文件,因为 Windows 程序通常使用两个字符作为行终止符。某些程序(例如写字板)在写入文件时可能会使用 \r 作为行终止符。要读取此类文件,请使用 LINES TERMINATED BY '\r'。

        【讨论】:

          【解决方案4】:

          1.如果是制表符分隔的 txt 文件:

          LOAD DATA LOCAL INFILE 'D:/MySQL/event.txt' INTO TABLE 事件

          由 '\r\n' 终止的行;

          2。否则:

          LOAD DATA LOCAL INFILE 'D:/MySQL/event.txt' INTO TABLE 事件

          以“x”结尾的字段(这里的 x 可以是逗号“,”、制表符“\t”、分号“;”、空格“”)

          由 '\r\n' 终止的行;

          【讨论】:

            【解决方案5】:

            你应该设置选项:

            local-infile=1
            

            进入 my.cnf 文件的 [mysql] 条目或使用 --local-infile 选项调用 mysql 客户端:

            mysql --local-infile -uroot -pyourpwd yourdbname
            

            您必须确保在 [mysqld] 部分中也定义了相同的参数,以启用“本地 infile”功能服务器端。

            这是一个安全限制。

            LOAD DATA LOCAL INFILE '/softwares/data/data.csv' INTO TABLE tableName;
            

            【讨论】:

              【解决方案6】:

              LOAD DATA INFILE 语句以非常高的速度将文本文件中的行读入表中。

              LOAD DATA INFILE '/tmp/test.txt' 
              INTO TABLE test
              FIELDS TERMINATED BY ','
              LINES STARTING BY 'xxx';
              

              如果数据文件如下所示:

              xxx"abc",1
              something xxx"def",2
              "ghi",3
              

              结果行将是 ("abc",1) 和 ("def",2)。跳过文件中的第三行,因为它不包含前缀。

              LOAD DATA INFILE 'data.txt'
              INTO TABLE tbl_name
              FIELDS TERMINATED BY ','
              ENCLOSED BY '"'
              LINES TERMINATED BY '\r\n'
              

              您还可以使用 mysqlimport 实用程序加载数据文件;它通过向服务器发送 LOAD DATA INFILE 语句来运行

              mysqlimport -u root -ptmppassword --local test employee.txt
              
              test.employee: Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
              

              【讨论】:

                【解决方案7】:

                使用 MySQL 的 LOAD DATA 命令演练:

                1. 创建你的表:

                  CREATE TABLE foo(myid INT, mymessage VARCHAR(255), mydecimal DECIMAL(8,4));
                  
                2. 创建制表符分隔文件(注意列之间有制表符):

                  1   Heart disease kills     1.2
                  2   one out of every two    2.3
                  3   people in America.      4.5
                  
                3. 使用加载数据命令:

                  LOAD DATA LOCAL INFILE '/tmp/foo.txt' 
                  INTO TABLE foo COLUMNS TERMINATED BY '\t';
                  

                  如果您收到无法运行此命令的警告,则必须启用此处描述的--local-infile=1 参数:How can I correct MySQL Load Error

                4. 插入的行:

                  Query OK, 3 rows affected (0.00 sec)
                  Records: 3  Deleted: 0  Skipped: 0  Warnings: 0
                  
                5. 检查它是否有效:

                  mysql> select * from foo;
                  +------+----------------------+-----------+
                  | myid | mymessage            | mydecimal |
                  +------+----------------------+-----------+
                  |    1 | Heart disease kills  |    1.2000 |
                  |    2 | one out of every two |    2.3000 |
                  |    3 | people in America.   |    4.5000 |
                  +------+----------------------+-----------+
                  3 rows in set (0.00 sec)
                  

                如何指定将文本文件列加载到哪些列:

                像这样:

                LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo
                FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n'
                (@col1,@col2,@col3) set myid=@col1,mydecimal=@col3;
                

                文件内容被放入变量@col1、@col2、@col3。 myid 获取第 1 列,mydecimal 获取第 3 列。如果运行,它将省略第二行:

                mysql> select * from foo;
                +------+-----------+-----------+
                | myid | mymessage | mydecimal |
                +------+-----------+-----------+
                |    1 | NULL      |    1.2000 |
                |    2 | NULL      |    2.3000 |
                |    3 | NULL      |    4.5000 |
                +------+-----------+-----------+
                3 rows in set (0.00 sec)
                

                【讨论】:

                • 在我的 MySQL 版本(Ver 14.14 Distrib 5.5.41)上,我需要从这些命令中省略 LOCAL。 (ERROR 1148 (42000): 该 MySQL 版本不允许使用的命令)
                • LOCAL 关键字会影响文件的预期位置和错误处理。 LOCAL 仅在您的服务器和客户端都已配置为允许时才有效。 dev.mysql.com/doc/refman/5.0/en/load-data.html
                • 在这里分享我的愚蠢:我认为“本地”在服务器上是本地的(从 mysql 服务器引擎的角度来看)......但正如你指出的 Eric,它都在文档中.它说 LOCAL 选项导致 mysqlimport 从客户端主机读取数据文件。这意味着如果我在自己的计算机上运行 MySQL Workbench,LOAD DATA 命令会在我的计算机上查找文件!
                • 您可能还想使用 CHARSET SET 正确解析您的文件
                【解决方案8】:

                如果您的表格由制表符以外的其他表格分隔,则应将其指定为...

                LOAD DATA LOCAL 
                    INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport 
                    COLUMNS TERMINATED BY '\t'  ## This should be your delimiter
                    OPTIONALLY ENCLOSED BY '"'; ## ...and if text is enclosed, specify here
                

                【讨论】:

                • 你能详细说明你的答案吗?
                【解决方案9】:

                它应该像...一样简单

                LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport;
                

                默认LOAD DATA INFILE 使用制表符分隔,每行一行,所以应该接受它就好了。

                【讨论】:

                • 上面的代码如何理解这将在哪个数据库中插入记录?
                • @LOKESH:单独来看,它不能。事先,您需要使用 USE 命令设置要使用的数据库。
                • 我认为数据表也需要在数据库中创建才能正常工作?
                • @HattrickNZ 是的,并且操作已经创建了问题中提到的表
                • LOAD DATA INFILE '/tmp/mydata.txt' INTO TABLE PerformanceReport FIELDS TERMINATED BY '\t'
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-11-21
                • 1970-01-01
                • 2014-04-11
                • 2012-11-22
                • 2017-11-15
                相关资源
                最近更新 更多