将文本文件转换为 CSV 或将每个值存储在 mysql 中?

Converting a text file into CSV or storing each value in mysql?

SampNum            Acc_X              Acc_Y              Acc_Z  
1                  0.89304            0.00366            -0.247416
2                   0.89304             0.00366          -0.247416
3                   0.887184            0.008052            -0.240096

我有一个类似这样的日志文件,我需要将其转换为 csv 文件,或者只选择每个字段并将其保存到 mysql table 中,列名为 SampNum 等以及相应的值。

如何使用 php 完成?

请:

  • 当您可以使用 ext/mysqli 或 PDO 时,不要使用已弃用的 ext/mysql。
  • 不要将整个 csv 文件读入 PHP 变量。当文件为 500MB 时会发生什么情况?
  • 当您可以使用内置函数 fgetcsv() 时,不要编写自定义 PHP 代码来解析 csv 数据。
  • 当您可以使用准备好的语句时,不要为数据中的每一行创建新的 SQL 语句。
  • 不要将外部文件中的数据插入到 SQL 语句中。这有 SQL 注入漏洞的风险,就像您插入不受信任的用户输入时一样。
  • 当您可以使用MySQL 的LOAD DATA INFILE 命令时,不要逐行解析和插入csv 数据。它比逐行插入快 20 倍。

这是一个更简单的解决方案:

<?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";

?>