【问题标题】:PHP inserting parsed values from text file into MySQL DBPHP将文本文件中的解析值插入MySQL DB
【发布时间】:2012-11-29 04:57:11
【问题描述】:

我是 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”插入到该名称的字段中。因此,该行在 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;
}      

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

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

}

【问题讨论】:

  • 嗨,托德,欢迎来到 SO。您与数据库的连接在哪里?
  • 嗨,@史蒂夫。 db 连接位于文档的顶部。我用过“require_once('db.php');”它引用了一个数据库连接。
  • 我们需要查看您尝试插入值的代码...这只是将它们存储在一个数组中,是吗?到目前为止,一切看起来都不错。
  • 谢谢,@史蒂夫。我还没有为该任务编写查询,因为我不确定我是否以最有效、最有用的方式隔离变量。另外,我不确定需要什么查询。我确实在上面包含了我想要的数据库结构。我将进行编辑,将该段放入 SO 代码格式。

标签: php mysql file text import


【解决方案1】:

使用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 语句之前对其进行准备和转义。

【讨论】:

  • 我可以使用 $query = mysql_real_escape_string($sql)
  • 我在这个上采取了程序路线!感谢您启发我使用 parse_ini_file() 函数。杰出的。我已经编辑了我的问题以包括我到目前为止所做的事情。 ATM,它只是 CRUD 的一个简单读取部分。 @leepowers
【解决方案2】:

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

【讨论】:

  • 我不确定我是否能很好地理解这个答案,因为我对 OOP 不太(或几乎不)熟悉。我如何应用此代码来完成我上面所说的?感谢您的帮助!
  • 非常有帮助!但是,我发现 parse_ini_file() 返回一个多维数组,所以这个循环实际上会将“toneX”及其所有属性作为单个值回显。这只是嵌入额外的 foreach 循环的问题。谢谢! @尼基塔
【解决方案3】:

这是另一种方法。只需要根据您的需要(行数/凭据)进行修改。最好使用 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();
    }
}

【讨论】:

  • 谢谢,伙计。这很棒!我已经编辑了我的问题,以包括我迄今为止提出的问题。 @Ardy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-15
  • 2010-10-04
  • 1970-01-01
相关资源
最近更新 更多