2009-08-03 5 views
1

У меня есть .txt-файл с данными о продукте, который я хочу прочитать на php. Каждая строка содержит один продукт, а детали продукта (номер, имя и цена) разделяются вкладками. Как вы можете видеть ниже, не всегда верно, что цены красиво выровнены по вертикали, из-за разницы в длине для имен prodcut. Данные выглядят следующим образом:php read data data txt file

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) разделить каждую строку на вкладке ("\ т" символов)

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); 
+0

Что вы считаете действительно большим? Я думаю, это около 2000 строк.Какой другой подход вы бы рассмотрели? – Fortega

+0

2000 строк звучит отлично. Для чего-то более чем в нескольких мегабайтах у меня не будет массива * whole * products в памяти, а вместо этого перебирайте элементы - возможно, используя fgets(), чтобы получить отдельные строки из файла. –

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

Это будет замедленным с использованием взрыва, но он также может анализировать файлы, у которых есть только одна вкладка в качестве разделителя между значениями. Кроме того, вам не придется снимать знак $. Если вы wan't держать $ знак с ценой, которую вы должны использовать это регулярное выражение вместо:

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

делает \ s означать вкладка в регулярном выражении? код продукта может также быть чем-то другим, но я могу изменить его. – Fortega

+0

\ s означает любые пробелы, так что табуляции, пробелы, отпечатки и подача строк, однако, поскольку мы сопоставляем одну строку за раз, это будет соответствовать только пробелам и вкладкам. Это на случай, если кто-то допустил ошибку и разделил значения с пробелами вместо вкладок, этот скрипт позволит также получить значения из этого, а решение 'explode' будет аварийно завершено. – RaYell

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