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 的最后一列:文件创建或错误。我想搜索字符串“PDF 文件已创建/错误”,然后获取文件名。

我已经尝试过各种各样的事情,比如pathinfo()strpos。但是,我似乎无法理解我将如何完成它。

有人可以为我提供一些关于如何解决这个问题的意见吗?txt 文件和数据库非常庞大。

注意:我提供了日志文件的第二个条目,以明确错误出现的格式不一致。我想知道我是否仍然可以通过不一致的错误格式来实现我应该达到的目标。有人可以在再次阅读整个问题后提供帮助吗?与我第一次发布此内容相比,发生了很多变化。

4

3 回答 3

3

您可以使用explodephp 的方法将您的文件分成多个单词。如果您的文本文件中的字段是制表符分隔的,那么您可以在空格分隔的情况下展开explode(String,'\t');,或者在空格分隔的情况下展开空格。

然后substr(word,start_index,length)每个单词上的一个简单的可以给你文件的名称(这里start_index应该是0)。

使用mysql_connect将帮助您连接到 mysql 数据库,或者更有效的方法是使用PDO(PHP 数据对象)使您的代码更加可靠和灵活。

另一种方法是使用该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.

编辑:请记住,$matches 将是一个多维数组,如http://php.net/manual/en/function.preg-match-all.phphttp://php.net/manual/en所述/function.preg-match.php

要测试正则表达式,您可以使用http://regexpal.com/

于 2012-12-04T16:02:38.597 回答