php ürün veri txt dosyasını okumak

4 Cevap php

Ben php okumak istediğiniz ürün verileri ile bir. Txt dosyası var. Her satır bir ürün içerir ve ürün bilgileri (sayı, isim ve fiyat) sekmeler ile ayrılır. Aşağıda görebileceğiniz gibi, fiyatları güzel çünkü dürtmek adları için uzunluğu farkı, dikey hizalanmış bu her zaman doğru değildir. Verileri bu gibi görünebilir:

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

(Ben sekmeleri nasıl göstereceğimi bilmiyordum, bu yüzden yukarıdaki örnekte boşluk vardır, ama gerçek dosyasında, gerçek sekmeler)

Bunu yapmanın en etkili yolu nedir? Ben ürün başına ürün verilerini içeren bir dizi sahip olmak isterdim (bu arada, uzak bir dosya):

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

Çok teşekkürler!

4 Cevap

1) kolay yolu dosya gerçekten büyük olmadığı sürece (o zaman ben) başka bir yaklaşım düşünün bir diziye bütün satırları yüklemek için dosya () kullanıyor.

2) sekmesini her satırı bölmek ("\ t" karakteri)

Istediğiniz gibi 3) ​​dizi sütunları "biçimlendirmek".

Örnek parçacık:

$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);

fgetcsv () iyi bir fonksiyonudur

check out the example from http://us3.php.net/manual/en/function.fgetcsv.php, here's a slightly modified version:

$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);
$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]
    );
}

Bu, daha yavaş olacak patlayabilir ama aynı zamanda değerler arasında ayırıcı olarak sadece bir sekme daha sonra sahip dosyalarını ayrıştırmak kullanarak. Artı fiyatlardan $ işaretini şerit zorunda kalmazsınız. Eğer fiyat ile $ işaretini tutmak için wan't bu regex yerine kullanmalısınız:

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