我是PHP新手,我正在尝试解析txt文件中的某些文本,然后将文本插入到MySQL数据库中。所以,让我们更具体一点。文件的格式是这样的,它通过文档结束重复。椭圆表示前一个和下一个音调。
...
[Tone27]
Atone = 707.3
Btone = 746.8
Btonelength = 3
Btonedebounce = 1
Description = Fire Department 1
mp3_Emails = email@address.com,email2@address.com,email3@address.com
amr_Emails = email2@textmessaging.com,email1@textmessaging.com
alert_command = c:\test.bat
post_email_command = c:\test2.bat
radio_frequency = 154.475
exclude_from = 13:25
exclude_to = 13:35
exclude_emails = email2@textmessaging.com,email2@address.com
...
我想要做的是从文件中解析每个“音调块”中的第一项(例如'[tone27]')并将其插入数据库中NEW行的第一个字段。然后我需要评估每行“=”之前的内容,例如“Atone”,并将该行“=”之后的内容(例如“707.3”)插入到该名称的字段中。所以,这行可能在db中看起来像这样:
$id | [tone27] | 707.3 |746.8 | 3 | 1 | Fire Department 1 |email1@x.com,email2@x.com,e...|...
依旧......
我已经能够通过执行字符串函数来隔离每个东西,但我不确定如何设置一个可以正确插入每个值的循环。这是我用来隔离它们的代码,但它实际上并没有帮助它们进入数据库。
$txt_file = file_get_contents('config/tones.txt');
$rows = explode("\n", $txt_file);
foreach($rows as $row => $data)
{
$row_data = explode(' = ', $data);
if ((isset($row_data[0])) && ($row_data[0] !== " " )){
$info[$row]['attribute'] = $row_data[0];
$info_attribute = trim($info[$row]['attribute']);
}
if (isset($row_data[1])){
$info[$row]['value'] = $row_data[1];
$info_value = trim($info[$row]['value']);
//display data
echo 'Row ' . $row . ' Attribute: ' . $info_attribute . '<br />';
echo 'Row ' . $row . ' Value: ' . $info_value . '<br />';
} elseif (($info[$row]['attribute']) && (!empty($info_attribute))) {
echo "<br>";
echo 'Row ' . $row . ' Attribute: ' . $info_attribute . '<br />';
continue;
}
我是一个NOOB,没有DOUBT。我迷路了。在此先感谢您的帮助!!!
****|| EDIT ||****
感谢所有优秀的答案!这就是我最终提出来的。还没有查询,只是简单的CRUD读取部分,但代码将是相同的,只有查询。非常感谢@leepowers向我介绍了精彩的parse_ini_file()函数。
foreach(parse_ini_file("config/tones.txt", true) as $k => $v){
extract($v, EXTR_SKIP);
echo "<br>";
echo $k . "<br>";
foreach($v as $sv => $ssv){
$lcase_sv = strtolower($sv);
if (trim($lcase_sv) == 'amr_emails'){
echo "sv: amr_Emails:<br>";
echo "ssv:<br>";
$eA = explode(',', trim($ssv));
foreach($eA as $eK => $eV){
echo "email" . filter_var($eK + 1, FILTER_SANITIZE_NUMBER_INT) . ": " . $eV . "<br>";
}
} elseif (trim($lcase_sv) == 'mp3_emails'){
echo "ssv:<br>";
$eA = explode(',', trim($ssv));
foreach($eA as $eK => $eV){
echo "email" . filter_var($eK + 1, FILTER_SANITIZE_NUMBER_INT) . ": " . $eV . "<br>";
}
}else {
echo "sv: " . $sv .", " . "s: " . $ssv . "<br>";
}
}
}
答案 0 :(得分:0)
parse_ini_file($source);返回一个关联数组
$query = 'INSET INTO ... (key, value) VALUES (:key, :value)';
$stmt = DB::prepare($query);
foreach( parse_ini_file($source) as $key => $value )
{
$stmt->execute(array(':key' => $key, ':source' => $source));
}
此示例使用PDO
只需在循环中输出文件:
foreach( parse_ini_file($source) as $key => $value )
{
echo $key; // Atone in first loop
echo $value; //707.3 in first loop
// BUT NOT USE THIS!!! use mysqli or PDO
mysql_query("INSERT INTO ... (key, value) VALUES ($key, $value)");
}
答案 1 :(得分:0)
使用parse_ini_file
将数据结构加载到数组中。
从那里你可以构建和执行SQL语句:
$entries = parse_ini_file("config/tones.txt", true);
foreach ($entries as $section => $fields) {
extract($fields, EXTR_SKIP);
$sql = "INSERT INTO mytable (section, atone, btone) VALUES ($section, '$Atone', '$Btone'";
....
}
当然,在执行之前,您需要准备并转义SQL语句。
答案 2 :(得分:0)
这是另一种方法。只需要根据您的需要(行数/凭证)进行修改。最好使用PDO。
$username = 'yourusername';
$password = 'yourpass';
try {
$conn = new PDO('mysql:host=127.0.0.1;dbname=yourdbname', $username, $pass);
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo 'successfully connected';
} catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
foreach(parse_ini_file('yourfile.ini', true) as $row)
{
try {
// just adjust the number of columns accordingly
$stmt = $conn->prepare('insert into tablename values(?,?,?,?,?,?,?,?,?,?,?,?,?)');
// $row contains the values to insert
$stmt->execute($row);
echo 'rows affected' . $stmt->rowCount(); // 1
}catch(PDOException $e) {
echo 'ERROR: ' . $e->getMessage();
}
}