如何连接不同行的单行列中的列

时间:2015-01-03 11:58:26

标签: php mysql excel

我需要读取Excel数据并保存到数据库中,但遇到了以下问题:

Excel格式:  Spreadsheet

我需要在数据库中保存数据,但问题是在消息列中某些列以[1/2-PNR]开头,这意味着它有一条长消息,分为两部分,如[2/2] -PNR]

但该消息需要保存在一个列中

就像消息[1/3-ADF]这样的消息被分成三个部分,需要在单列中保存在数据库中

我尝试使用以下代码保存数据,但无法执行此操作。

我使用此zip文件来阅读excel https://code.google.com/p/php-excel-reader/downloads/detail?name=php-excel-reader-2.21.zip

<?php
//error_reporting(0);
$host="localhost";
$username="root";
$password="";
$db_name="abro";

mysql_connect("$host", "$username", "$password")or die("cannot connect to server");
mysql_select_db("$db_name")or die("cannot select db");
ini_set("display_errors",1);
error_reporting(0);
require_once 'excel_reader2.php';
 $date=date('d-M-Y',strtotime("-1 days"));
 $actual_file=$date.".xls";
$xls = new Spreadsheet_Excel_Reader($actual_file);
$success=0;


for ($row=1;$row<=$xls->rowcount();$row++)
{
     $mobile_no=$xls->val($row,1);
     $party_name=$xls->val($row,2);
      $message=$xls->val($row,3);

     if($row==1)
     {

     }
     else{
         $query="insert into party_excel set
                                party_name='".mysql_real_escape_string($party_name)."',
                                message='".mysql_real_escape_string($message)."',
                                moble_no='".mysql_real_escape_string($mobile_no)."'
                                  ";
        $query_run=mysql_query($query);
        echo mysql_error();
        $success++;                            
     }


 }
 if($success>0)
 {
     echo "file imported successfully";
 } 

实际上这张表用于保存短信。如果SMS超过160个字符,则剩余的消息将保存在下一行中。但是当我显示消息时,我想在同一行显示消息。

1 个答案:

答案 0 :(得分:0)

最初,因为图像难以阅读,我认为你会在消息中包含尽可能多的列,但我现在意识到你的行数和部分一样多。

我认为最好用PHP处理数据,如下所示:

$part = 1;
$parts = 1;
for ($row=2; $row<=$xls->rowcount(); $row++) {
     $mobile_no=$xls->val($row,1);
     $party_name=$xls->val($row,2);
     if ($part < $parts) { // need to merge rows
        $message = $message . $xls->val($row,3);
        $part++;
     }
     else { // a new message
          $message = $xls->val($row,3);
          $pattern = "/^\[()\/()-" . $party_name . "\]/";
          $part = 1;
          if (preg_match($pattern, $message, $matches)) {
             $parts = $matches[2];
          }
          else $parts = 1;
     }
     if ($part == $parts) { // completed a message
        $query="insert into party_excel set
                    party_name='".mysql_real_escape_string($party_name)."',
                    message='".mysql_real_escape_string($message)."',
                    moble_no='".mysql_real_escape_string($mobile_no)."'
                                  ";
        $query_run=mysql_query($query);
        echo mysql_error();
        $success++;                            
     }
}

我已经将你的循环调整为2,因为你被丢弃了第1行。我已经合并了多部分消息,即我没有删除[1/2-SJF]指标。

另外,我宁愿将行输出到CSV,然后使用LOAD DATA INFILE通过mysql本身一次性插入所有行:http://dev.mysql.com/doc/refman/5.1/en/load-data.html

免责声明:此代码尚未经过测试,特别是仔细检查$ pattern。