Работа с csv файлами в Human Emulator

Часто для работы скрипта требуется ввод каких то данных, например, для заполнения полей при подаче объявлений на доски,
заполнении виз или форм подачи заявок на кредиты и т.д. Эти данные можно брать из баз данных,
из текстовых файлов различного формата, со страниц вашего сайта, из почтовых ящиков.
Но одним из наиболее удобных форматов являются данные представленные в формате csv файлов.
Это файлы, каждая строка которых содержит данные для заполнения одной формы или объявления,
значения которых разделены ; и могут быть взять в кавычки — «.
К примеру вот строка из файла данных для нашего скрипта публикации объявлений на доске Slando:

Peugeot 508 Allure 2.0HDI 2012;Транспорт;Легковые автомобили;Peugeot;508;37638;Белый;2012;Автомат;Дизель;2000;4000;Частное лицо;0953203020;Безопасность: ABD, ABS, ESP, Иммобилайзер, Ксеноновые фары, Подушка безопасности (Airbag), Серворуль, Сигнализация, Центральный замок.Комфорт: Бортовой компьютер, Датчик света, Климат контроль, Кожаный салон, Круиз контроль, Мультируль, Омыватель фар, Парктроник, Подогрев зеркал, Подогрев сидений, Сенсор дождя, Усилитель руля, Эл. стеклоподъемники, Электропакет. Мультимедиа: CD, DVD, MP3, Акустика, Магнитола, Система навигации GPS.Автомобиль с тест-драйва, на учете не стоял. Комплектация Allure + ксенон + сигнализация + передний парктроник + белый перламутр.;img1.jpg,img2.jpg;Киевская;Киев;iltaua

Вот о том как работать с такими данными мы и расскажем в этой статье.

Итак, у нас есть файл data.csv в котором содержатся следующие данные:

value1;value2;value3;value4
value11;value12;value13;value14
value21;value22;value23;value24
value31;value32;value33;value34

Рассмотрим способы получения этих данных в скрипт.

Первый и самый примитивный способ это использование php функций file и explode. Ниже приведён пример скрипта,
который использует эти функции для разбора csv файла:

<?php

$xhe_host ="127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// путь к данным
$data_path="data/data.csv";
// читаем в массив
$arr_data=file($data_path);
// выводим в окно отладки результат
print_r($arr_data);
// пройдёмся по всему массиву данных
foreach($arr_data as $item)
{  
    // получаем в массив данные разделённые ; 
    $arr_item=explode(";",$item);
    // смотрим результат
    print_r($arr_item);
    // используем данные
    echo  $arr_item[0]."
"; echo $arr_item[1]."
"; echo $arr_item[2]."
"; echo $arr_item[3]."
"; } // Quit $app->quit(); ?>

В результате работы скрипта в окне отладки мы увидим следующее:

Array
(
[0] => value1;value2;value3;value4

[1] => value11;value12;value13;value14

[2] => value21;value22;value23;value24

[3] => value31;value32;value33;value34
)
Array
(
[0] => value1
[1] => value2
[2] => value3
[3] => value4

)
value1
value2
value3
value4

Array
(
[0] => value11
[1] => value12
[2] => value13
[3] => value14

)
value11
value12
value13
value14

Array
(
[0] => value21
[1] => value22
[2] => value23
[3] => value24

)
value21
value22
value23
value24

Array
(
[0] => value31
[1] => value32
[2] => value33
[3] => value34
)
value31
value32
value33
value34

Минус данного способа внутри данных нельзя использовать разделители. В нашем случае это «;» .

В php для работы с csv файлами есть функции fgetcsv и str_getcsv.

Функция fgetcsv читает строку из файла и разбирает данные CSV. Она похожа на функцию fgets(),
только дополнительно делает анализ строки на формат CSV и возвращает разобранные поля в виде массива.
Возвращает FALSE в случае ошибки или прочитав полностью файл.Пустая строка будет возвращена в виде массива,
содержащего один элемент null, ошибки в данном случае не будет.

Ниже приведём пример использования этой функции для файла data.csv:

<?php

$xhe_host ="127.0.0.1:7010";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// путь к данным
$data_path="data/data.csv";

$row = 1;
$handle = fopen($data_path, "r");
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 
{
    $num = count($data);
    echo "

$num полей в строке $row:

\n"; $row++; for ($c=0; $c < $num; $c++) { echo $data[$c] . "
\n"; } } fclose($handle); // Quit $app->quit(); ?>

str_getcsv — данная функция выполняет разбор строки в формате CSV и возвращает массив с полученными из строки полями.
То есть она работает аналогично explode, но только конкретно для csv строк. Таким образом, эта функция будет корректно разбирать csv данные,
в том числе и с содержанием спецсимволов, например:

value31;value32;"value34;123";value33

в результате работы explode будем иметь:

value31
value32
"value34
123"
value33

в результате работы функции str_getcsv

value31
value32
value34;123
value33

Пример скрипта с использованием str_getcsv:

<?php

$xhe_host ="127.0.0.1:40111";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// путь к данным
$data_path="data/data.csv";

// читаем в массив
$arr_data=file($data_path);
// выводим в окно отладки результат
//print_r($arr_data);
// пройдёмся по всему массиву данных
foreach($arr_data as $item)
{  
    // получаем в массив данные разделённые ; 
    $arr_item=str_getcsv($item,";");
    // смотрим результат
    print_r($arr_item);
    // используем данные
    echo  $arr_item[0]."
"; echo $arr_item[1]."
"; echo $arr_item[2]."
"; echo $arr_item[3]."
"; } // Quit $app->quit(); ?>

В результате работы скрипта имеем:

Array
(
[0] => value1
[1] => value2
[2] => value3
[3] => value4
)
value1
value2
value3
value4
Array
(
[0] => value11
[1] => value12
[2] => value13
[3] => value14
)
value11
value12
value13
value14
Array
(
[0] => value21
[1] => value22
[2] => value23
[3] => value24
)
value21
value22
value23
value24
Array
(
[0] => value31
[1] => value32
[2] => value33
[3] => value34
)
value31
value32
value33
value34

Так же в интернете можно найти множество самописных классов php,
которые работают с файлами в csv формате и использовать их в скриптах для Human Emulator,
как впрочем любые классы написание на php.