2012-01-25 32 views
0

我想解析並通過Blackberry Messenger生成的CSV文件創建單個文件。如何在PHP中解析Blackberry Messenger CSV?

一個例子:

BlackBerry Messenger,6.0.0.129CRLF 
201112071323251405361,"2732E6DB ","555ABCDA",TextData TextData TextData TextDataCRLF 
201112071323253558103,"555ABCDA","2732E6DB ",TextData TextData TextDataCRLF 
201112071323253746576,"2732E6DB ","555ABCDA",TextData TextData TextData 
LF 
TextData TextDataLF 
TextData TextData TextData TextData TextData TextData TextData TextData TextDataLF 
TextData TextData TextData TextDataCRLF 
201112071323253809444,"2732E6DB ","555ABCDA", TextData TextData TextData TextDataCRLF 
201112091323441592335,"2732E6DB ","555ABCDA", TextData TextDataLF 
    LF 
<3<3=.>:O :s=.>=) <3<3=.>:O :s=.>=)LF 
    LF 
- Copy all smiley aboveLF 
- pasteLF 
- erase 4 dotLF 
- send me backLF 
- see the magic (smiley change)LF 
    CRLF 

正如你可以看到CSV文件格式如下

Date,SendersPIN,ReceiversPIN,MessageText 

日期是YYYYMMDD +紀元格式。 每條記錄​​都以CRLF(回車換行符)字符結尾,而MessageText中的每一行都以LF(換行符)字符分隔。

正如你所看到的問題是MessageText不包含在任何容器中,它可能有許多新行。所以我不能直接導入到Excel中。

就文件操作而言,我會認爲自己是PHP的初學者,所以如果可能的話嘗試描述代碼。

謝謝。

+0

這是一個棘手的問題。 'fgetcsv'不起作用,因爲該消息也使用逗號,並將其作爲分隔符讀取。使用'fgets'逐行讀取,然後以逗號分隔('explode')不能正常工作,因爲消息會溢出到下一行。 – xbonez

回答

0

正如@ xbonez所說,這樣做非常棘手。我認爲你需要一次閱讀每一行。第一個「列」中的日期可能是您確定新消息開始的訣竅。這會不會是PHP代碼,但該方法我會用:

<?php 
$handle = open($filename,"r"); 
$input_line = fgets($handle); // Reads the first line of the file, which we will discard 
$input_line = fgets($handle); //read a line of text from the file 
$msg_data = ''; 
$mesg = ''; 
$first_run = TRUE; 
while (!$input_line) // Check whether we've reached the end of the file, 
        // fgets returns FALSE if we have 
{ 
    if (new_bbm_message($input_line)) 
    { 

    if(!$first_run) 
    //You now have a complete message, do something with it. I'm just going to print it. 
     echo $msg_data . addslashes($mesg); 
    else $first_run = FALSE; 

    // Get the new messages data 
    $msg_data = substr($input_line,0,46); // Get string with Date,SendersPIN,RecieversPIN up to the ',' after receivers pin. 
    $mesg = substr($input_line,47); 
    } 
    else 
    { 
    // This is another line of text of the message. 
    $mesg .= $input_line; 
    } 

    // Read in the next line of text. 
    $input_line = fgets($handle);  
} 

?> 

new_bbm_message功能是你寫的,以確定該行是一個新的BBM消息(開始的東西,如果行返回TRUE是一條新消息,如果它是消息的延續,則爲FALSE)。您可以嘗試將該行的前20個字符更改爲PHP中的有效日期,或者測試位置21是否爲逗號。

您需要仔細檢查substr調用的一些號碼,它們可能是關閉的。

祝你好運。

+0

看起來不錯。但是,你能建議一個函數來檢查這條線是否是新消息嗎?更新:每條消息以CRLF(回車換行符)字符結束,而MessageText中的每一行都以LF(換行符)字符分隔。 – dkcreatto

+0

很高興你找到了解決方案。 「您可以嘗試將該行的前20個字符更改爲PHP中的有效日期,或者測試位置21是否爲逗號。」是我建議的功能。我不會寫整個功能,因爲我不知道你會採用哪種方法。 –