2017-05-04 87 views
1

我試圖從我的服務器中提取用戶的電子郵件地址。但問題是最大的文件是.txt,但有些是CSV文件與txt擴展名。當我試圖讀取和提取時,我無法讀取帶有TXT擴展名的CSV文件。這裏是我的代碼:如何使用php7讀取任何文件類型?

<?php 
$handle = fopen('2.txt', "r"); 
while(!feof($handle)) { 
     $string = fgets($handle); 
    $pattern = '/[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]{2,4}/i'; 
    preg_match_all($pattern, $string, $matches); 
    foreach($matches[0] as $match) 
{ 
echo $match; 
echo '<br><br>'; 
} 
} 
?> 

我試圖用這個代碼。該程序正在讀取CSV文件的完整文件,並逐行讀取文本文件。有成千上萬的文件,因此很難識別。

請問我該怎麼做才能解決我的問題?有什麼解決方案可以讀取任何格式,那麼它會很棒。

+0

還是沒有得到什麼問題?使用'fgets',您可以逐行讀取任何文件 –

+0

@AlexSlipknot任何文件,但如果文件擴展名被更改會怎麼樣。我在'TXT'文件中有'CSV'文件。但CSV文件的文件擴展名是'.TXT'。該程序無法讀取該文件,因此無法處理該文件。那麼是否有任何文件可以通過擴展名來讀取? –

+0

'fgets'可以讀取CSV,所以它可能不是CSV? –

回答

1

那麼你的文件是不同的。正因爲如此,你將不得不爲每個人採取不同的方法。更一般地說,這通常是調用適配,並且主要通過使用Adapter design pattern來提供。

你應該使用適配器設計模式,你就必須檢查要打開一個文件的擴展名,並分別任txtcsv. Based on the value you would retrieve a TxtParser or a CsvParser`一個switch代碼。

但是,在深入探索這片土地之前,您可能需要先看看這些文件。我無法確定這一點,但沒有看到結構,但你可以。如果文本和csv文件的內容相同,那麼一個非常簡單的方法是將擴展名更改爲txt或所有文件的csv,然後使用相同的邏輯處理它們,因爲知道具有相同擴展名的文件現在將被處理以相同的方式。

但從我瞭解的文件結構實際上不同。所以爲了讓你的代碼簡化適配器模式,有兩個單獨的類/函數用於解析,另一個用於選擇正確的解析函數(這個頂層函數實際上是一個strategy的形式)並運行它。

無論哪種方式,我非常懷疑,所以你面臨的問題有一個解決方案,因爲文件結構大多是你自己的。

0

好吧,所以問題是,當CSV文件有太長的字符串行。基於這個限制,我建議你使用php.net這個例子:

$handle = @fopen("/tmp/inputfile.txt", "r"); 

if ($handle) { 
    while (($buffer = fgets($handle, 4096)) !== false) { 
     echo $buffer; 
     // do your operation for searching here 
    } 
    if (!feof($handle)) { 
     echo "Error: unexpected fgets() fail\n"; 
    } 
    fclose($handle); 
}