LOAD DATA LOCAL INFILE不能跳过列?

use*_*451 0 php mysql

我已经搜索了几个小时,但它不起作用.

我有一个总统职位的csv文件.第一行是标题.

Presidency ,President ,Wikipedia Entry,Took office ,Left office ,Party ,Portrait,Thumbnail,Home State
Run Code Online (Sandbox Code Playgroud)

我想创建一个只有一个关系Presidency,PresidentParty.

$sqlquerycreate1 = "CREATE TABLE IF NOT EXISTS `sample1` (
  `Presidency`  VARCHAR(30),
  `President` VARCHAR(30),
  `Party` VARCHAR(30)
)";
mysql_query($sqlquerycreate1);

# download the file off the internet
$file = file_get_contents("http://localhost/sample.csv");
$filepath = "sample.csv";
file_put_contents($filepath, $file);

# load the data into nycgrid table
$pt11 = "LOAD DATA LOCAL INFILE ";
$pt21 = "'C:/xampp/htdocs/test/file/sample.csv' INTO TABLE sample1(Presidency,President,@Wikipedia Entry,@Took office ,@Left office ,Party,@Portrait,@Thumbnail,@Home State) ";
$pt31 = "FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ";
$pt41 = "LINES TERMINATED BY '\r\n' ";
$pt51 = "IGNORE 1 LINES";
$sqlquerynew1 = $pt11.$pt21.$pt31.$pt41.$pt51;
mysql_query($sqlquerynew1);
Run Code Online (Sandbox Code Playgroud)

它不起作用.表已创建,但未加载任何数据.知道为什么吗?谢谢.


mysql> LOAD DATA LOCAL INFILE 'C:/xampp/htdocs/sample.csv' INTO TABLE sample1(Pr
esidency, President, @x, @x, @x, Party, @x, @x, @x) FIELDS TERMINATED BY ',' ENC
LOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES;


ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'FIELD
S TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINE' at
line 1
Run Code Online (Sandbox Code Playgroud)

egg*_*yal 5

您的LOAD DATA语句中有语法错误.特别是:

  1. 手册所述:

    用户变量写为@var_name,其中变量名称var_name由字母数字字符" ."," _"和" $"组成.用户变量名可以包含其他字符,如果您引用它作为一个字符串或标识符(例如,@'my-var',@"my-var",或@`my-var`)

    因此,你的变量命名@Wikipedia Entry,@Took office,@Left office@Home state都是语法不正确.您必须删除空格或引用变量名称.

    但是,除非您打算在别处引用它们,否则不需要使用不同的变量名称.如手册所述:

    您还可以通过将输入值分配给用户变量而不将变量分配给表列来丢弃输入值:

    LOAD DATA INFILE 'file.txt'
      INTO TABLE t1
      (column1, @dummy, column2, @dummy, column3);
    
    Run Code Online (Sandbox Code Playgroud)
  2. FIELDS,LINESIGNORE条款都应该preceed列的列表.如手册所述,语法为:

    LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
        [REPLACE | IGNORE]
        INTO TABLE tbl_name
        [CHARACTER SET charset_name]
        [{FIELDS | COLUMNS}
            [TERMINATED BY 'string']
            [[OPTIONALLY] ENCLOSED BY 'char']
            [ESCAPED BY 'char']
        ]
        [LINES
            [STARTING BY 'string']
            [TERMINATED BY 'string']
        ]
        [IGNORE number LINES]
        [(col_name_or_user_var,...)]
        [SET col_name = expr,...]
    Run Code Online (Sandbox Code Playgroud)

因此,您可以简单地做到:

LOAD DATA LOCAL INFILE 'C:/xampp/htdocs/test/file/sample.csv'
    INTO TABLE sample1
    FIELDS
        TERMINATED BY ','
        ENCLOSED BY '\"'
    LINES
        TERMINATED BY '\r\n'
    IGNORE 1 LINES
    (Presidency, President, @x, @x, @x, Party, @x, @x, @x)
Run Code Online (Sandbox Code Playgroud)