0

次の形式のログ ファイル ( log.txt) があります。

=========================================
March 01 2050 13:05:00 log v.2.6 
General Option: [default] log_options.xml
========================================= 
Loaded options from xml file: '/the/path/of/log_options.xml'
printPDF started
PDF export
PDF file created:'/path/of/file.1.pdf'
postProcessingDocument started
INDD file removed:'/path/of/file.1.indd'
Error opening document: '/path/of/some/filesomething.indd':Error: file doesnt exist or no permissions 
=========================================
March 01 2050 14:15:00 log v.2.6 
General Option: [default] log_options.xml
========================================= 
Loaded options from xml file: '/the/path/of/log_options.xml'
extendedprintPDF started
extendedprintPDF: Error: Unsaved documents have no full name: line xyz

注: 各ファイル名の形式は、3lettersdatesomename_LO.pdf/indd です。例: MNM011112ThisFile_LO.pdf。また、ここで示したように、特定の日時に、エントリにエラーのみ、作成されたファイルに関するメッセージのみ、またはその両方が含まれる可能性があります。

ファイルはこのように続きます。そして、次の形式のデータベースがあります。

id  itemName status
1   file     NULL

等々...

ここで、ログ ファイルを調べて、作成された各ファイルについて、またはエラーが発生した場合は、適切なメッセージで DB の最後の列を更新する必要があります: File created または Error. 「PDFファイルが作成されました/エラー」という文字列を検索してから、ファイル名を取得することを考えました。

pathinfo()や など色々試してみstrposました。しかし、どうやってそれを成し遂げようとしているのか理解できないようです。

どうすればこれを解決できるかについて、誰かが私にいくつかの情報を提供してもらえますか? txt ファイルとデータベースはかなり巨大です。

注: エラーが表示される形式が一貫していないことを明確にするために、ログ ファイルの 2 番目のエントリを提供しました。エラーの形式に一貫性がなくても、想定されていることをまだ達成できるかどうかを知りたいです。質問全体をもう一度読んだ後、誰か助けてもらえますか?これを最初に投稿したときから多くの変更がありました。

4

3 に答える 3

3

explodephpのメソッドを使用して、ファイルを単語に分割できます。テキストファイルのフィールドがタブで区切らexplode(String,'\t');れている場合は、スペースで区切られている場合はスペースで展開できます。

次に、substr(word,start_index,length)各単語を簡単に指定すると、ファイルの名前が得られます(ここstart_indexでは0にする必要があります)。

を使用mysql_connectすると、mysql データベースに接続するのに役立ちます。また、PDO (PHP データ オブジェクト)を使用して、コードの信頼性と柔軟性を大幅に高めることも、より効率的な方法です。

もう 1 つの方法は、このpreg_matchメソッドを使用して、エラー メッセージに一致する正規表現を指定し、ファイル名を解析することです。

ヘルプについては、いつでもphp.net のマニュアルを参照できます。

于 2012-12-04T16:12:26.680 に答える
0

さて、ここでの主な問題は、「エントリ」の一貫した区切り文字がないか、十分な情報を提供していないことです。だからあなたが提供したものに基づいて、ここに私の提案があります。ここでの主な注意点は、「エントリ」の区切り文字がないと、エラーがファイル名と一致するかどうかを確実に知る方法がないということです。これを修正する唯一の方法は、ファイルをより適切にフォーマットすることです。また、データベース情報や実際にクエリを実行する方法など、いくつかの空白を埋める必要があります。

$handle = fopen("log.txt", "rb");
while (!feof($handle)) {
  // get the current row 
  $row = fread($handle, 8192);

  // get file names
  preg_match('~^PDF file created:(.*?)$~',$row,$match);
  if ( isset($match[1]) ) {
    $files[] = $match[1];
  }

  // get errors
  preg_match('~^Error:(.*?)$~',$row,$match);
  if ( isset($match[1]) ) {
    $errors[] = $match[1];
  }
}
fclose($handle);

// connect to db

foreach ($files as $k => $file) {
  // assumes your table just has basename of file
  $file = basename($file);

  $error = ( isset($errors[$k]) ) ? $errors[$k] : null;

  $sql = "update tablename set status='$error' where itemName='$file'";

  // execute query
}

編集: 実際に投稿に戻ると、挿入ではなくテーブルを更新したいようです。そのため、クエリを更新に変更する必要があります。また、ファイル名をデータベースに保存する方法によっては、where句で$ fileをさらに操作する必要がある場合がありforeachます(たとえば、ベース名だけを保存する場合は、で実行することをお勧めします$file = basename($file);foreach。これを反映するようにコードが更新されました。

うまくいけば、これはあなたを正しい方向に向けるでしょう。

于 2012-12-04T16:16:27.077 に答える
0

ファイルはすべてPDFですか?その場合、拡張子が .pdf のファイルで正規表現検索を実行できます。ただし、ファイル名もエラー文字列に含まれている場合は、何らかの方法で除外する必要があります。

// Assume filenames contain only upper/lowercase letters, 0-9, underscores, periods, dashes, and forward slashes
preg_match_all('/([a-zA-Z0-9_\.-/]+\.pdf)/', $log_file_contents, $matches);
// $matches should be an array containing each filename.
// You can do array_unique() to exclude duplicates.

編集: http://php.net/manual/en/function.preg-match-all.phpおよびhttp://php.net/manual/enで説明されているように、$matches は多次元配列になることに注意してください。/function.preg-match.php

正規表現をテストするには、 http://regexpal.com/を使用できます。

于 2012-12-04T16:02:38.597 に答える