【问题标题】:Is this the best format of CSV file for importing into a MySQL database这是导入 MySQL 数据库的最佳 CSV 文件格式吗
【发布时间】:2016-04-12 04:02:54
【问题描述】:

我有以下格式的数据(样本数据,有很多行):

"Rec Open Date","number 1","number 2","Data Volume (Bytes)","Device Manufacturer","Device Model","Product Description"
"2015-10-06","0427","70060","137765","Samsung Korea","Samsung SM-G900I","$39 option"
"2015-10-06","7592","55620","0","Apple Inc","Apple iPhone 6 (A1586)","some text  #16"
...

我想知道的是,将其导入 mysql 的最佳格式/实践是什么?

一些具体问题是:

  1. 日期应该是“2015-10-06”
  2. 第 2、3 和 4 列是否应为带双引号的字符串格式,例如“0427”
  3. 对于列标题,我应该删除所有空格和括号
  4. 其他的

也许我的数据在导入我的数据库之前看起来会更好:

  • 用下划线替换所有空格
  • 去掉括号
  • 通过删除双引号将第 2、3 和 4 列转换为值

看起来像这样:

"Rec_Open_Date","number_1","number_2","Data_Volume_Bytes","Device_Manufacturer","Device_Model","Product_Description"
"2015-10-06",0427,70060,137765,"Samsung Korea","Samsung SM-G900I","$39 option"
"2015-10-06",7592,55620,0,"Apple Inc","Apple iPhone 6 (A1586)","some text  #16"
...

再次只是在寻找最佳实践。

下一个问题是是否有一个解析器可以完成所有这些工作,可能是 bash 或其他等效的?

【问题讨论】:

  • CSV 文件的顺序应与导出数据的顺序完全相同。导出的数据应与导入的 csv 数据相同。
  • 所以你会按原样导入,而不做任何更改?
  • 你应该对数据库进行数据库更改;不在 csv 上。
  • 我该怎么做?只是要清楚。我是否按原样导入,然后在数据库中进行更改(名称更改等),不确定我是否完全遵循...

标签: php mysql bash csv


【解决方案1】:

您可以在命令行中使用mysql load data infile 完成这项工作,如下所述:http://dev.mysql.com/doc/refman/5.7/en/load-data.html

如果您可以控制 csv 文件的格式,则将加载到数字数据库类型中的任何值都不应包含引号。如您所展示的,日期值适用于 mysql DATE 类型。如果您被该 csv 格式困扰,您可以使用加载数据选项来转换输入值,如下所述:LOAD DATA INFILE easily convert YYYYMMDD to YYYY-MM-DD? 该示例是关于日期转换的,但也可以进行许多其他转换。

另外请注意,如果您的 db 表已经定义,您可以跳过标题行,因此无需担心标题匹配列名和空格等。

【讨论】:

    【解决方案2】:

    1.一种方法是将csv文件导入mysql,可以使用phpMyAdmin之类的工具。

    2.你可以试试这个代码。它是一个将文件转换为 mysql 的 php 脚本。

    <?php    
    $databasehost = "localhost";
    $databasename = "test";
    $databasetable = "sample"; 
    $databaseusername="test"; 
    $databasepassword = "";
    $fieldseparator = ",";
    $lineseparator = "\n";
    $csvfile = "filename.csv";
    if(!file_exists($csvfile)) {
    die("File not found. Make sure you specified the correct path.");
    }
    try {
    $pdo = new PDO("mysql:host=$databasehost;dbname=$databasename", 
        $databaseusername, $databasepassword,
        array(
            PDO::MYSQL_ATTR_LOCAL_INFILE => true,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        )
    );
    } catch (PDOException $e) {
    die("database connection failed: ".$e->getMessage());
    }
    
    $affectedRows = $pdo->exec('
    LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
      FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
      LINES TERMINATED BY ".$pdo->quote($lineseparator))." ');
    echo "Loaded a total of $affectedRows records from this csv file.\n";
    ?>
    

    3.您可以使用任何框架或工具来做到这一点。

    【讨论】:

    • 在第 27 行出现错误LINES TERMINATED BY ".$pdo-&gt;quote($lineseparator)); --- 语法错误或访问冲突:1148 此 MySQL 版本不允许使用的命令
    • 我在该行中编辑了一个小错误。你现在可以试试。
    • 如果还是有问题,那么先尝试把exec字符串放到语句中,然后使用变量。
    • 也试试这个:在 mysql 命令行上使用 --local-infile=1 参数:当你在终端上启动 MySQL 时,包括 --local-infile=1 参数,像这样:mysql --local-infile=1 -uroot -p mysql>LOAD DATA LOCAL INFILE '/tmp/foo.txt' INTO TABLE foo COLUMNS TERMINATED BY '\t';然后允许该命令:查询 OK,3 行受影响(0.00 秒)记录:3 已删除:0 跳过:0 警告:0
    猜你喜欢
    • 2018-11-01
    • 2014-01-11
    • 2017-11-15
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多