使用命令行客户端

时间:2017-04-05 21:37:58

标签: mysql

我是MySQL的新手。我有超过2000个文本文件中的数据,我需要导入到表中。我创建了如下表:

CREATE TABLE test1
(   
    Month TINYINT UNSIGNED,
    Day TINYINT UNSIGNED,
    Year TINYINT UNSIGNED,
    Weight FLOAT UNSIGNED,
    length FLOAT UNSIGNED,
    Site_Number CHAR(3),
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (id)
);

我的文本文件中的所有数据都以逗号分隔。每个文件包含数千行,每行包括月,日,年,重量和长度信息。 site_number是文件名的前三个数字。例如,如果文件名是A308102316.txt,则从该文件导入的所有记录的site_number将为308.此外,我希望ID自动递增。

我的问题是:如何使用MySQL命令行客户端实现我上面描述的内容,因为我对PHP或其他一无所知。我知道如何将一个文本文件导入到表中,但不知道如何编写循环来读取其中的许多文本。另外,不知道如何从文件名中获取site_number。

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:0)

听起来您的文本文件实际上是CSV。您应该能够重命名为A308102316.csv,并在Excel中查看以验证。

对于导入,我建议调查csv.thephpleague.com

以下是CSV到MySQL的example

首先,我要做的是将所有text / csv文件放在专用目录loop over the files(用PHP)中,然后使用thephpleague/csv库运行导入。

也许是这样的:

use League\Csv\Reader;

//We are going to insert some data into the users table
$sth = $dbh->prepare(
    "INSERT INTO test1 (Month, Day, Year, Weight, length, Site_Number) VALUES (:month, :day, :year, :weight, :length, :site_number)"
);

$csv = Reader::createFromPath('/path/to/your/csv/A308102316.csv');
$csv->setOffset(1); // if you don't want to insert the header (first row)
$nbInsert = $csv->each(function ($row) use (&$sth) {
    //Do not forget to validate your data before inserting it in your database
    $sth->bindValue(':month', $row[0], PDO::PARAM_STR);
    $sth->bindValue(':day', $row[1], PDO::PARAM_STR);
    $sth->bindValue(':year', $row[2], PDO::PARAM_STR);
    $sth->bindValue(':weight', $row[3], PDO::PARAM_STR);
    $sth->bindValue(':length', $row[4], PDO::PARAM_STR);
    $sth->bindValue(':site_number', $row[5], PDO::PARAM_STR);
    return $sth->execute(); //if the function return false then the iteration will stop
});

每个$row[0]代表您在CSV中定义的特定列,以0作为第一个列。

答案 1 :(得分:0)

更新您可以通过利用LOAD DATA INFILE在bash中执行单行加载所有文件。

for file in `ls -1`; \
do mysql databasename -h localhost -u username -e " \
LOAD DATA LOCAL INFILE '${file}' \
INTO TABLE test1 \
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' \
SET site_number = '${file:1:3}'; \
"; done

这假定

  • cd带有文件的目录;即cd /path/to/data/files
  • 您的目录包含数据文件;没有子目录,符号链接或文件应该加载。
  • 您已设置.my.cnf个文件,因此您无需输入密码2000次

当然,您需要将databasename,localhost和username更改为实际值。

如果您恰好在Windows上,可以使用git-bash