PHP将解析后的值从文本文件插入MySQL DB

时间:2012-11-29 04:57:12

标签: php mysql file text import

我是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>"; 
    }
}

}

3 个答案:

答案 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();
    }
}