2012-12-04 43 views
0

我對形式的日誌文件(log.txt):從字符串匹配後的文本文件獲取文件名 - PHP

========================================= 
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 

等等......

現在,我預計要在日誌文件和創建的每個文件或是否有在錯誤,我應該用相應的消息更新數據庫的最後一列:創建的文件或錯誤。我想到搜索字符串「PDF文件創建/錯誤」,然後抓取文件名。

我嘗試了各種東西,如pathinfo()strpos。但是,我似乎無法理解我將如何完成它。

有人可以請我提供一些關於如何解決這個問題的意見嗎? txt文件和db非常大。

注意:我提供了日誌文件的第二項,以清楚顯示錯誤的格式不一致。我想知道我是否仍然可以實現我應該以錯誤格式不一致的方式。 有人在再次閱讀整個問題後請幫忙嗎?從我第一次發佈這個以來,發生了很多變化。

+1

你可以在日誌中發佈行的格式而不是「更多信息」嗎?如果你需要文本處理,你必須先找到一個模式。 – Udan

+0

您是否可以發佈至少一整行錯誤?然後我們可以看到一個匹配的正則表達式。如果您可以在文件中發佈大約10個不同的錯誤行,這將是很好的 –

+0

使文件格式更清晰。該文件只是繼續這樣。對於某些日期/時間,有多個PDF創建和錯誤。隨着每個PDF被創建,.indd文件被刪除。 –

回答

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.phphttp://php.net/manual/en/function.preg-match.php

要測試一個正則表達式的表情,你可以使用http://regexpal.com/

+0

請參閱我所做的編輯。現在更清楚的是,log.txt包含了什麼。 –

3

可以使用explode php的方法將你的文件分解成文字。 如果文本文件中的字段是製表符分隔的,那麼您可以在explode(String,'\t');上爆炸,否則在空間分離的情況下會在空間上爆炸。

然後一個簡單的substr(word,start_index,length)上每個單詞都可以給你文件名(這裏的start_index應該是0)。

使用mysql_connect將幫助您連接到MySQL數據庫,或更有效的方法是使用PDO(PHP數據對象)讓你的代碼更可靠和靈活。

另一種出路是使用preg_match方法並指定一個匹配錯誤消息的正則表達式並解析文件名。

您隨時都可以參考php.net manual尋求幫助。

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子句中使用foreach中的$ file來進一步工作,這取決於你如何將你的文件名存儲在你的db中(例如,如果你只存儲了基本名稱,你可能會想在foreach中做$file = basename($file);) 。代碼更新以反映這一點。

所以希望這會指出你在正確的方向。

+0

請參閱我所做的編輯。現在更清楚的是,log.txt包含了什麼。 –

+0

好吧,我提供的東西仍然會「與你所擁有的東西一起工作」,但是我也提到了同樣的警告。你提供了一個我們文本文件的「入口」,顯示了有關文件,錯誤等的信息。但是有什麼東西將日誌文件中的每個「條目」分開,比如一行*或某物,或者它直接進入下一個條目? –

+0

此外,你並沒有真正清楚你真的想要更新你的數據庫與..你想更新「狀態」列產生的錯誤,或一些普通的消息或什麼?當人們說「要清楚你想要什麼」時,這意味着展示一個例子,你想從你的日誌文件的條目中看到你想看到的內容,你想要看到的內容顯示在你的數據庫中,等等。 –

相關問題