将 txt 文件中的数据逐列添加到 mysql (php- PDO)
add data from txt file to mysql column by column (php- PDO)
我有一个 TXT
文件,它们之间没有标点符号。我想按数据库中的 table 列宽度粉碎此文件并保存它。
让我一步一步告诉你……
我正在用我的 tabloolustur.php
页面在数据库中创建一个 table。我创建的 table 的列号和列宽不会相同。
TXT
文件数据之间没有标点符号。首先,我想按列宽拆分 TXT 文件行。
$result = $baglanti->prepare("SHOW COLUMNS FROM customers where Field NOT IN('id')");
$result->execute();
$colcount = $result->columnCount()-1;
$columLen = array();
foreach($result as $key => $col){
preg_match('/\d+/', $col['Type'], $len);
$len = (isset($len[0]))? $len[0] : '';
$fieldname = $col['Field'];
$columLen[$fieldname] = $len;
}
为此,我用代码获取了列数和列宽。
然后,我使用以下函数用逗号分隔数据。
function txtBol($metin, $genislik){
$parcala=array();
foreach ($genislik as $sutunadi => $lenght)
{
$parcala[$sutunadi] = substr($metin, 0, $lenght);
$metin = substr($metin, $lenght);
}
return $parcala;
}
我还使用以下代码获取列名。 (ps:在查询中使用)
$KolAdi = $baglanti->query("SHOW COLUMNS FROM customers where Field NOT IN('id')");
$KolAdi->execute();
$colonAdi= $KolAdi->fetchAll(PDO::FETCH_COLUMN);
$colonAdi=implode(',', $colonAdi);
它在打印到屏幕时正确打印我分割的数据。到目前为止,一切都很好。但是我无法使用 PDO 创建正确的查询。我应该如何创建查询? (ps:Table列名和列宽不一样,每个table会有不同的列数和宽度列)
如果您能提供帮助,我将不胜感激。我从您的网站上实施了一些解决方案。
Table
:
id
name
cev1
cev2
cev3
1
MARTIN EDEN
AAAAAA
BBBBB
CCCC
txt
:
MARTIN EDEN........AAAAAABBBBBDDDD
您可以像这样创建一个 table 并且您不需要按行检查多个字段
让我知道这是否有用
创建 TABLE new_table
(
id
INT NOT NULL AUTO_INCREMENT,
row_id
INT NULL 默认值 0,
row_field_name
VARCHAR(50) NULL 默认 NULL 注释 'Index of ',
row_value
VARCHAR(255) NULL 默认 NULL,
主键 (id
));
假设 $PDO 中有一个有效的 PDO 连接,您可以像这样完成整个工作。
它读取一次列数据并使用它来创建一个查询来准备和一个正则表达式来提取数据。
$table = 'customer';
$txtFile = 'cust.txt';
// No need to prepare this since there's no untrusted data here.
$result = $pdo->query("show columns from `$table` where Field <> 'id'");
// Get column names and widths in arrays
while($columns = $result->fetch(PDO::FETCH_ASSOC)) {
$colNames[] = $columns['Field'];
preg_match('/\d+/', $columns['Type'], $len);
$colLengths[] = $len[0]??'';
}
// Create regex to extract data from lines:
// Looks like this: /(.{20})(.{10})(.{5})/
$regex = '/(.{'.implode('})(.{',$colLengths).'})/u';
// Create skeleton query with table name and field names and placeholders
// Looks like this: INSERT customer (name,addr1,postcode) VALUES (?,?,?)
$query = "INSERT $table (`".implode('`,`', $colNames).'`) VALUES ('.str_repeat('?,', count($colNames)-1).'?)';
// Read text file
if ($fileData = file($txtFile)) {
// Prepare the query only once
$stmt = $pdo->prepare($query);
foreach ($fileData as $row) {
// Get the data using the regex from above
preg_match($regex, $row, $rowData);
// Remove the first row of the regex matches - see PHP manual for why
array_shift($rowData);
// Now execute the prepared query using the data extracted by the regex.
$stmt->execute($rowData);
}
}
请注意,此代码假定 table 由一系列连续的列组成,它可以从中提取列宽,并且除了 id
之外没有其他列,它会忽略它。如果您的实际 table 结构不同,您需要修改 SHOW COLUMNS
查询以忽略这些列,或修改提取列数据的代码以仅提取相关列。
{编辑]
更新了代码以在正则表达式中包含 /u
UTF-8 修饰符,并将 INSERT 查询中的列名称包装在反引号中。
我有一个 TXT
文件,它们之间没有标点符号。我想按数据库中的 table 列宽度粉碎此文件并保存它。
让我一步一步告诉你……
我正在用我的
tabloolustur.php
页面在数据库中创建一个 table。我创建的 table 的列号和列宽不会相同。TXT
文件数据之间没有标点符号。首先,我想按列宽拆分 TXT 文件行。$result = $baglanti->prepare("SHOW COLUMNS FROM customers where Field NOT IN('id')"); $result->execute(); $colcount = $result->columnCount()-1; $columLen = array(); foreach($result as $key => $col){ preg_match('/\d+/', $col['Type'], $len); $len = (isset($len[0]))? $len[0] : ''; $fieldname = $col['Field']; $columLen[$fieldname] = $len; }
为此,我用代码获取了列数和列宽。
然后,我使用以下函数用逗号分隔数据。
function txtBol($metin, $genislik){ $parcala=array(); foreach ($genislik as $sutunadi => $lenght) { $parcala[$sutunadi] = substr($metin, 0, $lenght); $metin = substr($metin, $lenght); } return $parcala; }
我还使用以下代码获取列名。 (ps:在查询中使用)
$KolAdi = $baglanti->query("SHOW COLUMNS FROM customers where Field NOT IN('id')"); $KolAdi->execute(); $colonAdi= $KolAdi->fetchAll(PDO::FETCH_COLUMN); $colonAdi=implode(',', $colonAdi);
它在打印到屏幕时正确打印我分割的数据。到目前为止,一切都很好。但是我无法使用 PDO 创建正确的查询。我应该如何创建查询? (ps:Table列名和列宽不一样,每个table会有不同的列数和宽度列) 如果您能提供帮助,我将不胜感激。我从您的网站上实施了一些解决方案。
Table
:
id | name | cev1 | cev2 | cev3 |
---|---|---|---|---|
1 | MARTIN EDEN | AAAAAA | BBBBB | CCCC |
txt
:
MARTIN EDEN........AAAAAABBBBBDDDD
您可以像这样创建一个 table 并且您不需要按行检查多个字段 让我知道这是否有用
创建 TABLE new_table
(
id
INT NOT NULL AUTO_INCREMENT,
row_id
INT NULL 默认值 0,
row_field_name
VARCHAR(50) NULL 默认 NULL 注释 'Index of ',
row_value
VARCHAR(255) NULL 默认 NULL,
主键 (id
));
假设 $PDO 中有一个有效的 PDO 连接,您可以像这样完成整个工作。 它读取一次列数据并使用它来创建一个查询来准备和一个正则表达式来提取数据。
$table = 'customer';
$txtFile = 'cust.txt';
// No need to prepare this since there's no untrusted data here.
$result = $pdo->query("show columns from `$table` where Field <> 'id'");
// Get column names and widths in arrays
while($columns = $result->fetch(PDO::FETCH_ASSOC)) {
$colNames[] = $columns['Field'];
preg_match('/\d+/', $columns['Type'], $len);
$colLengths[] = $len[0]??'';
}
// Create regex to extract data from lines:
// Looks like this: /(.{20})(.{10})(.{5})/
$regex = '/(.{'.implode('})(.{',$colLengths).'})/u';
// Create skeleton query with table name and field names and placeholders
// Looks like this: INSERT customer (name,addr1,postcode) VALUES (?,?,?)
$query = "INSERT $table (`".implode('`,`', $colNames).'`) VALUES ('.str_repeat('?,', count($colNames)-1).'?)';
// Read text file
if ($fileData = file($txtFile)) {
// Prepare the query only once
$stmt = $pdo->prepare($query);
foreach ($fileData as $row) {
// Get the data using the regex from above
preg_match($regex, $row, $rowData);
// Remove the first row of the regex matches - see PHP manual for why
array_shift($rowData);
// Now execute the prepared query using the data extracted by the regex.
$stmt->execute($rowData);
}
}
请注意,此代码假定 table 由一系列连续的列组成,它可以从中提取列宽,并且除了 id
之外没有其他列,它会忽略它。如果您的实际 table 结构不同,您需要修改 SHOW COLUMNS
查询以忽略这些列,或修改提取列数据的代码以仅提取相关列。
{编辑]
更新了代码以在正则表达式中包含 /u
UTF-8 修饰符,并将 INSERT 查询中的列名称包装在反引号中。