2009-08-03 83 views
1

我有一個帶有產品數據的.txt文件,我想在php中閱讀。每行包含一個產品,產品詳細信息(編號,名稱和價格)由製表符分隔。正如您在下面看到的,由於產品名稱的長度不同,價格垂直對齊並不總是正確的。數據是這樣的:php讀取產品數據txt文件

ABC001 an item description $5.50 
XYZ999 an other item $6 
PPP000 yet another one $8.99 
AKA010 one w a longer name $3.33 
J_B007 a very long name, to show tabs $99 

(我不知道如何表達的標籤,所以他們在本例以上的空間,但在真正的文件,它是真正的製表符)

什麼是做到這一點的最有效的方法? (順便說一下,這是一個遠程文件),我很想有每個產品包含產品數據的數組:

$product['number'], $product['name'] and $product['price'] 

非常感謝!

回答

2

1)最簡單的方法是使用文件()加載的所有行到一個數組(除非該文件是真正的大,那麼我會考慮另一種方法)。

2)分割由選項卡( 「\ t」 的字符)

3) 「格式」 你希望陣列列的每一行。

示例代碼段:

$productsArray = file($productsFileName, FILE_IGNORE_NEW_LINES); 

foreach ($productsArray as $key => &$product) { 
    $arr = explode("\t", $product); 
    $product = array('number' => $arr[0], 'name' => $arr[1], 'price' => $arr[2]); 
} 

var_dump($productsArray); 
3

您可以逐行讀取文件(例如,使用函數file,例如,它會讓您將每行放入數組的一行)。

,然後,每個這些線路的使用explode,分隔字段:

$data_of_line = explode("\t", $string_line); 

使用 「\t」(製表「)作爲分隔符

你會再有$data_of_line[0]包含數字,$data_of_line[1]名稱,$data_of_line[2]價格。

1
$fileArr = file('path.to.your.file.txt'); 

$productsData = array(); 

for ($i = 0; $i < count($fileArr); $i++) { 
    $lineData = preg_match('/^(\w{3}\d{3})\s+(.*)\s+\$(\d+(\.\d+))$/', $fileArr[$i], $matches); 
    $productsData[] = array(
     'number' => $matches[1], 
     'name' => $matches[2], 
     'price' => $matches[3] 
    ); 
} 

這將是SLO使用爆炸,但它也可以解析多個文件,只有一個選項卡作爲值之間的分隔符。另外,您不必從價格中去除$標誌。如果你wan't保持$標誌的價格,你應該使用這個表達式來代替:

'/^(\w{3}\d{3})\s+(.*)\s+(\$\d+(\.\d+))$/' 
+0

不\ S指的是正則表達式中的標籤?產品代碼也可以是別的東西,但我可以改變。 – Fortega 2009-08-03 07:00:21

+0

\ s表示任何空格,因此製表符,空格,製表符返回和換行,但是因爲我們一次只匹配一行,所以只會匹配空格和製表符。這是爲了防止某人犯了錯誤,並用空格而不是製表符分隔值,這個腳本也可以從那裏獲取值,而`爆炸'解決方案會崩潰。 – RaYell 2009-08-03 07:06:43

2

fgetcsv()是一個不錯的功能

簽出 http://us3.php.net/manual/en/function.fgetcsv.php的例子,這裏有一個稍作修改的版本:

$products = array(); 
$handle = fopen("products.txt", "r"); 

while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) { 
    $products[] = array(
     'number' => $data[0], 
     'name' => $data[1], 
     'price' => $data[2] 
    ); 
} 
fclose($handle);