Как разобрать Blackberry Messenger CSV в PHP? - PullRequest
0 голосов
/ 25 января 2012

Я хочу проанализировать и создать один файл из файлов CSV, созданных из Blackberry Messenger.

Пример:

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

Дата указана в формате ГГГГММДД + эпохи. Каждая запись заканчивается символами CRLF (перевод строки назад), а каждая новая строка в MessageText отделяется символом LF (перевод строки).

Как видите, проблема в том, что MessageText не содержится ни в одном контейнере и может содержать много новых строк. Поэтому я не могу импортировать его непосредственно в Excel.

Я бы считал себя новичком в PHP в том, что касается файловых операций, поэтому, если возможно, попробуйте описать код.

Спасибо.

1 Ответ

0 голосов
/ 26 января 2012

Как говорит @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 запятой.

Вам необходимо дважды проверить некоторые номера для вызовов подстроек, они могут быть отключены.

Удачи.

...