php читать текстовый файл данных о продукте - PullRequest
1 голос
/ 03 августа 2009

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

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']

Большое спасибо!

Ответы [ 4 ]

3 голосов
/ 03 августа 2009

Вы можете читать файл построчно (например, с помощью функции file, которая выведет каждую строку в одну строку массива).

И затем используйте explode в каждой из этих строк, чтобы отделить поля:

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

Использование "\t" (табуляция ") в качестве разделителя.

Тогда у вас будет $data_of_line[0], содержащее число, $data_of_line[1] имя и $data_of_line[2] цена.

2 голосов
/ 03 августа 2009

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);
2 голосов
/ 03 августа 2009

1) Самый простой способ - использовать file () для загрузки всех строк в массив (если файл не очень большой, тогда я хотел бы рассмотреть другой подход).

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);
1 голос
/ 03 августа 2009
$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]
    );
}

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

'/^(\w{3}\d{3})\s+(.*)\s+(\$\d+(\.\d+))$/'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...