【问题标题】:Loading csv into mysql selecting columns将csv加载到mysql选择列
【发布时间】:2015-08-13 13:47:54
【问题描述】:

我正在尝试学习如何有效地使用 mysql。现在,我想将包含作者书目的 csv 加载到 mysql 数据库中。这是我生成数据库并尝试上传文件的代码:

USE stephenkingbooks;

DROP TABLE IF EXISTS stephenkingbooks;
CREATE TABLE stephenkingbooks
(
  `id`              int unsigned NOT NULL auto_increment,
  `original_title`  varchar(255) NOT NULL,
  `spanish_title`   varchar(255) NOT NULL,
  `year`            decimal(4) NOT NULL,
  `pages`           decimal(10) NOT NULL,
  `in_collection`   enum('Y','N') NOT NULL DEFAULT 'N',
  `read`            enum('Y','N') NOT NULL DEFAULT 'N',

  PRIMARY KEY     (id)
);

LOAD DATA LOCAL INFILE '../files/unprocessed_sking.csv'
INTO TABLE stephenkingbooks (column1, column2, column4, column3)
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 ROWS;

csv 文件格式如下:

Carrie,Carrie,Terror,199,19745,"En 1976, el director de cine Brian de Palma hizo la primera película basada en la novela.7 3"

我的想法是只加载与 original_title 对应的前两个列,第二个是西班牙标题(在 mysql 和 csv 中相同),在 csv 中的 column3 之后是 pages,column4 是 @ 987654324@。

此外,对于年份列,我只想取该字段的前 4 个数字,因为我有一些参考不是年份的一部分。例如,Carrie 于 1974 年发布,但 csv 包含我不想考虑的日期中的 5。

我的问题是我无法在终端中毫无错误地获得我想要的东西......有什么建议吗?

【问题讨论】:

    标签: mysql csv load


    【解决方案1】:

    13.2.6 LOAD DATA INFILE Syntax

    ...

    如果字段的顺序在 输入文件与表中列的顺序不同。

    ...

    试试:

    mysql> LOAD DATA INFILE '../files/unprocessed_sking.csv'
        -> INTO TABLE `stephenkingbooks`
        -> FIELDS TERMINATED BY ','
        -> ENCLOSED BY '"'
        -> LINES TERMINATED BY '\r\n'
        -> (`original_title`, `spanish_title`, @`genre`, @`pages`, @`year`)
        -> SET `year` = LEFT(@`year`, 4), `pages` = @`pages`;
    Query OK, 1 row affected (0.00 sec)
    Records: 1  Deleted: 0  Skipped: 0  Warnings: 0
    
    mysql> SELECT
        -> `id`,
        -> `original_title`,
        -> `spanish_title`,
        -> `year`,
        -> `pages`,
        -> `in_collection`,
        -> `read`
        -> FROM `stephenkingbooks`;
    +----+----------------+---------------+------+-------+---------------+------+
    | id | original_title | spanish_title | year | pages | in_collection | read |
    +----+----------------+---------------+------+-------+---------------+------+
    |  1 | Carrie         | Carrie        | 1974 |   199 | N             | N    |
    +----+----------------+---------------+------+-------+---------------+------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 感谢您的回答!您的代码向我提出了错误:ERROR 29 (HY000): File '/home/samuel/github/mysql_tests/files/unprocessed_sking.csv' not found (Errcode: 13) 我已经尝试将目录 /var/lib/mysql 的所有者更改为 mysql:mysql 并且它不起作用
    • @Mastodon:运行MySQL的用户账号必须有访问/home/samuel/github/mysql_tests/files/unprocessed_sking.csv的权限,但是找不到文件的错误。
    • 解决了!非常感谢
    猜你喜欢
    • 2013-07-21
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多