将文本文件转换为 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";
?>
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";
?>