2010-10-24 77 views
0

我有一個非常大的.txt文件與我們的客戶訂單,我需要將它移動到一個MySQL數據庫。然而,我不知道使用什麼類型的正則表達式,因爲這些信息並沒有很大的不同。php,preg_match,正則表達式,提取特定文本

 
----------------------- 
4046904 


KKKKKKKKKKK 
Laura Meyer 
MassMutual Life Insurance 
153 Vadnais Street 

Chicopee, MA 01020 
US 
413-744-5452 
[email protected] 


KKKKKKKKKKK 
373074210772222 02/12 6213 NA 
----------------------- 
4046907 


KKKKKKKKKKK 
Venkat Talladivedula 

6105 West 68th Street 

Tulsa, OK 74131 
US 
9184472611 
venkat.talladivedula... 


KKKKKKKKKKK 
373022121440000 06/11 9344 NA 
----------------------- 

我試過的東西,但我甚至不能提取名字......這是我的努力沒有成功

 

$htmlContent = file_get_contents("orders.txt"); 

//print_r($htmlContent); 

$pattern = "/KKKKKKKKKKK(.*)\n/s"; 
preg_match_all($pattern, $htmlContent, $matches); 
print_r($matches); 
$name = $matches[1][0]; 
echo $name; 

+0

這是真實的數據? – 2010-10-24 22:57:45

回答

4

您可能希望避免的正則表達式的是這樣的一個樣本。由於數據清晰地按行組織,您可以用fgets()重複讀取行並以這種方式解析數據。

+0

借調。這看起來更像是'fgets()'或'file()'的工作,然後遍歷每一行來提取單個記錄。 – 2010-10-24 22:59:20

0

你可以用正則表達式讀這個文件,但它可能相當複雜創建一個可以讀取所有字段的正則表達式。

我建議你逐行閱讀這個文件,並解析每一個文件,檢測它包含哪種數據。

0

正如你知道你的數據的確切位置(即它的哪一行)爲什麼不只是這樣呢?

即像

$htmlContent = file_get_contents("orders.txt"); 

$arrayofclients = explode("-----------------------",$htmlContent); 
$newlinesep = "\r\n"; 
for($i = 0;i < count($arrayofclients);$i++) 
{ 
$temp = explode($newlinesep,$arrayofclients[i]); 
$idnum = $temp[0]; 
$name = $temp[4]; 
$houseandstreet = $temp[6]; 
//etc 
} 

或簡單地讀取線使用與fgets()文件中的行 - 是這樣的:

$i = 0;$j = 0; 
$file = fopen("orders.txt","r"); 
$clients = []; 
while ($line = fgets($ffile)) 
{ 
    if(line != false) 
    { 
     $i++; 
     switch($i) 
     { 
     case 2: 
      $clients[$j]["idnum"] = $line; 
      break; 
     case 6: 
      $clients[$j]["name"] = $line; 
      break; 
     //add more cases here for each line up to: 
     case 18: 
      $j++; 
      $i = 0; 
      break; 
     //there are 18 lines per client if i counted right, so increment $j and reset $i. 
     } 
    } 
} 
fclose ($f); 

你可以使用正則表達式的,但他們是一個有點尷尬的這情況。

Nico

0

爲了記錄,這裏是正則表達式,將爲您捕獲名稱。 (授予的速度非常好可能是一個問題。)

(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-) 

說明:

(?<=K{10}\s{2}) #Positive lookbehind for KKKKKKKKKK then 2 return/newline characters 
\K[^\r\n]++  #Greedily match 1 or more non-return/newline characters 
(?!\s{2}-)  #Negative lookahead for return/newline character then dash 

這裏是一個Regex Demo

你會注意到我的正則表達式模式在Regex Demo和我的PHP Demo之間略有變化。根據環境的輕微調整可能需要匹配返回/換行符。

這裏是PHP實現(Demo):

if(preg_match_all("/(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)/",$htmlContent,$matches)){ 
    var_export($matches[0]); 
}else{ 
    echo "no matches"; 
} 

通過我的方式使用\K我避免實際上有與括號來捕捉。這將數組大小減少了50%,對許多項目來說都是一個有用的技巧。 \K基本上說「從這一點開始全串匹配」,所以匹配在$matches的第一個子數組(fullstrings,key = 0)中進行,而不是在0中生成全數據串匹配,在1中生成捕獲。

輸出:

array (
    0 => 'Laura Meyer', 
    1 => 'Venkat Talladivedula', 
)