这是导入MySQL数据库的CSV文件的最佳格式

时间:2016-04-12 04:02:55

标签: php mysql bash csv

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

"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. 其他
  5. 在将数据导入我的数据库之前,我的数据可能会更好看:

    • 用下划线替换所有空格
    • 删除括号
    • 删除双引号
    • ,将第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或其他等价物吗?

2 个答案:

答案 0 :(得分:0)

您可以从命令行使用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表,则可以跳过标题行,因此无需担心标题与列名和空格等匹配。

答案 1 :(得分:0)

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.您可以使用任何框架或工具来执行此操作。