簡體   English   中英

如何串聯來自不同行的單行列中的列

[英]How to concatenate column in single row column from different rows

我需要讀取Excel數據並保存到數據庫中,但遇到以下問題:

Excel格式: 試算表

我需要將數據保存在數據庫中,但問題是在消息列中某些列的開頭為[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消息。 如果SMS超過160個字符,則其余消息將保存在下一行中。 但是,當我顯示消息時,我想在同一行上顯示消息。

最初,由於圖像難以閱讀,我認為您在郵件中的列數將與部分數相同,但現在我知道您的行數與部分數一樣多。

我認為最好的方法實際上是用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++;                            
     }
}

由於您已舍棄第1行,因此我已將循環調整為從2開始。我已經按原樣合並了多部分消息,即,我沒有刪除[1 / 2-SJF]指示器。

另外,我寧願將這些行輸出到CSV,然后使用LOAD DATA INFILE通過mysql本身一次將所有行插入: http : //dev.mysql.com/doc/refman/5.1/en/load-data .html

免責聲明:此代碼未經測試,特別是仔細檢查$ pattern。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM