字符串匹配后从文本文件获取文件名-PHP

字符串匹配后从文本文件获取文件名-PHP,php,strpos,pathinfo,Php,Strpos,Pathinfo,我有一个日志文件(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' prin

我有一个日志文件(
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
id  itemName status
1   file     NULL
注:每个文件名的格式为:3lettsdatesomename_LO.pdf/indd。示例:MNM011112此文件_LO.pdf。另外,在给定的日期和时间,条目可能只有错误,或者只有关于创建的文件的消息,或者两者都有,就像我在这里展示的那样

文件继续以这种方式运行。我有一个db,形式如下:

=========================================
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
id  itemName status
1   file     NULL
等等

现在,我需要检查日志文件,对于创建的每个文件,或者如果有错误,我应该使用适当的消息更新DB的最后一列:file created or error。我想搜索字符串“PDF file created/Error”,然后获取文件名

我尝试过各种方法,如
pathinfo()
strpos
。但是,我似乎不明白我要怎么做

有人能为我提供一些关于如何解决这个问题的信息吗?txt文件和db相当大

注意:我提供了日志文件的第二个条目,以明确错误出现的格式不一致。我想知道我是否仍然可以通过不一致的错误格式实现我应该实现的目标。
有人能在读完整个问题后再帮忙吗?从我第一次发布这篇文章开始,已经有了很多变化

所有文件都是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将是一个多维数组,如下所述和


要测试正则表达式,可以使用

所有文件都是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将是一个多维数组,如下所述和


要测试正则表达式,可以使用

您可以使用php的
explode
方法将文件分解为多个单词。 如果文本文件中的字段以制表符分隔,则可以在
explode(字符串'\t')上进行分解或在空间分隔的情况下,在空间上爆炸

然后,每个单词上的一个简单的
substr(word,start\u index,length)
就可以给出文件名(这里
start\u index
应该是0)

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

另一种解决方法是使用
preg\u match
方法,并指定一个正则表达式来匹配文件名的错误消息和解析


您可以随时参考以获取帮助。

您可以使用php的
explode
方法将文件分解为多个单词。 如果文本文件中的字段以制表符分隔,则可以在
explode(字符串'\t')上进行分解或在空间分隔的情况下,在空间上爆炸

然后,每个单词上的一个简单的
substr(word,start\u index,length)
就可以给出文件名(这里
start\u index
应该是0)

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

另一种解决方法是使用
preg\u match
方法,并指定一个正则表达式来匹配文件名的错误消息和解析


您可以随时参考以获取帮助。

好的,这里的主要问题是您要么没有“条目”的一致分隔符,要么您没有提供足够的信息。因此,根据您提供的信息,这里是我的建议。这里的主要警告是,如果没有“条目”的实心分隔符,就无法确定错误是否与文件名匹配。解决此问题的唯一方法是更好地格式化文件。此外,您还必须填写一些空白,如数据库信息和实际执行查询的方式

$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子句的
foreach
中进一步使用$file,这取决于您在数据库中存储文件名的方式(例如,如果您只存储basename,则可能需要在
foreach
中执行
$file=basename($file);
)。更新代码以反映这一点


因此,希望这将为您指明正确的方向。

好的,这里的主要问题是您要么没有“条目”的一致分隔符,要么您没有提供足够的信息。因此,根据您提供的信息,这里是我的建议。这里的主要警告是,如果没有“条目”的实心分隔符,就无法确定错误是否与文件名匹配。解决此问题的唯一方法是更好地格式化文件。此外,您还必须填写一些空白,如数据库信息和实际执行查询的方式

$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子句的
foreach
中进一步使用$file,这取决于您在数据库中存储文件名的方式(例如,如果您只存储basename,则可能需要在
foreach
中执行
$file=basename($file);
)。更新代码以反映这一点


因此,希望这将为您指明正确的方向。

您能在日志中发布行的格式而不是“更多信息”吗?如果您需要文本处理,您必须找到pat