Фильтровать файл CSV с помощью php
У меня есть файл CSV, доставляемый через FTP два раза в день. Я пытаюсь написать php-файл, чтобы открыть этот файл, отфильтровать его по столбцу категории, удалить строки, в которых нет определенного термина / терминов, а затем сохранить файл.
Я перепробовал множество вариантов фрагментов кода, найденных в Интернете, но не могу понять, как заставить его работать.
Я попытался использовать вариант кода, найденный в этом вопросе, но не смог заставить его работать в моем сценарии
Фильтруйте CSV-файл по слову или тексту, используя php
Если это помогает файл CSV, который я пытаюсь редактировать, находится здесь: http://accurateav.co.uk/sahara/saharafeed.csv
<?php
$file = fopen('saharafeed.csv', 'r');
// You can use an array to store your search words, makes things more flexible.
// Supports any number of search words.
$words = array('casio');
// Make the search words safe to use in regex (escapes special characters)
$words = array_map('preg_quote', $words);
$regex = '/'.implode('|', $words).'/i';
while (($line = fgetcsv($file)) !== FALSE) {
list($ExportDate, $ItemCode, $Manufacturer, $Model, $ProductName, $DealerPrice, $Stock, $RRP, $Category, $ShortDesc, $LongDesc, $Weightkg, $EAN, $NonStock, $LargePictureURL, $SpecSheet, $HiResPhoto1, $HiResPhoto2) = $line;
if(preg_match($regex, $Category)) {
echo "$ExportDate, $ItemCode, $Manufacturer, $Model, $ProductName, $DealerPrice, $Stock, $RRP, $Category, $ShortDesc, $LongDesc, $Weightkg, $EAN, $NonStock, $LargePictureURL, $SpecSheet, $HiResPhoto1, $HiResPhoto2<br />\n";
}
}
?>
Это код, который я использовал до сих пор, чтобы отфильтровать категорию, чтобы показать продукты только в категории Casio, однако, когда я запускаю сценарий, результаты не отображаются, хотя в категории Casio есть много продуктов.
2 ответа
Я думаю, что вы ищете неправильный столбец. casio
находится внутри колонки производителя. Вы должны искать там вместо этого. Рассмотрим этот пример:
$i = 0;
$manufacturer_key = null;
$needles = array('casio', 'nec', 'hitachi');
$results = array();
$columns = array();
if(($handle = fopen('saharafeed.csv', 'r')) !== false) {
while(($data = fgetcsv($handle, 4096, ',')) !== false) {
if($i == 0) {
// sets the key where column to search
$columns = $data;
$i++; $manufacturer_key = array_search('Manufacturer', $data);
} else {
foreach($needles as $needle) {
if(stripos($data[$manufacturer_key], $needle) !== false) {
$results[] = $data;
}
}
}
}
fclose($handle);
}
array_unshift($results, $columns);
echo '<pre>';
print_r($results);
echo '</pre>';
Пример вывода для casio
:
Array
(
[0] => Array
(
[0] => ExportDate
[1] => ItemCode
[2] => Manufacturer
[3] => Model
[4] => ProductName
[5] => DealerPrice
[6] => Stock
[7] => RRP
[8] => Category
[9] => ShortDesc
[10] => LongDesc
[11] => Weightkg
[12] => EAN
[13] => NonStock
[14] => LargePictureURL
[15] => SpecSheet
[16] => HiResPhoto1
[17] => HiResPhoto2
)
[1] => Array
(
[0] => 11/06/2014
[1] => 1610044
[2] => NEC
[3] => 60003221
[4] => NEC NP14ZL
[5] => 999
[6] => 0
[7] => 1348.65
[8] => Projectors Accessories
[9] => 2.97-4.79:1 Zoom Lens
[10] => Replacement 2.97–4.79:1 Zoom Lens compatible with the following products:
... and many more
Поместите результаты обратно в формат CSV:
$fp = fopen('file.csv', 'w');
foreach ($results as $row) {
fputcsv($fp, $row);
}
fclose($fp);
Remove the line matching by a regular expression (by eliminating one containing digital characters, at least 1 digit, located at the end of the line):
sed '/[0-9/][0-9]*$/d' filename.txt