1

我是 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]')并将其插入到数据库中新行的第一个字段中。然后,我需要评估每一行的“=”之前的内容,例如“Atone”,并将该行的“=”之后的内容,例如“707.3”插入到该名称的字段中。因此,该行在数据库中可能如下所示:

$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;
}      

我是菜鸟,毫无疑问。我迷路了。在此先感谢您的帮助!!!

****|| 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>"; 
    }
}

}

4

3 回答 3

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)");
}
于 2012-11-29T05:22:04.597 回答
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 语句之前对其进行准备和转义。

于 2012-11-29T05:23:12.493 回答
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();
    }
}
于 2012-11-29T08:44:50.290 回答