разбор удаленного csv-файла с PHP на GAE
Я, кажется, в catch-22 с небольшим приложением, которое я разрабатываю в PHP на Google App Engine с помощью Quercus;
- у меня есть удаленный csv-файл, который я могу загрузить и сохранить в строке
- для анализа этой строки Я бы идеально использовал str_getcsv, но Quercus еще не имеет этой функции
- Quercus, похоже, знает fgetcsv, но эта функция ожидает дескриптор файла, которого у меня нет (и я не могу сделать новый, поскольку GAE не позволяет файлам быть создано)
кто-нибудь получил представление о том, как решить эту проблему, не отказываясь от встроенных функций PHP csv-parser и вместо этого написать свой собственный парсер?
5 ответов
Я думаю, что самое простое решение-написать свой собственный парсер . это кусок пирога в любом случае и заставит вас узнать больше регулярных выражений - нет смысла, что в PHP нет строки csv для синтаксического анализа массива, поэтому совершенно оправданно писать свои собственные. Просто убедитесь, что это не слишком медленно ;)
вы можете создать новую обертку потока, используя stream_wrapper_register.
вот пример из руководства, который читает глобальные переменные:http://www.php.net/manual/en/stream.streamwrapper.example-1.php
вы можете использовать его как обычный дескриптор файла:
$csvStr = '...';
$fp = fopen('var://csvStr', 'r+');
while ($row = fgetcsv($fp)) {
// ...
}
fclose($fp);
Это показывает простой ручной парсер, который я написал с помощью примера ввода с квалифицированной, неквалифицированной функцией escape. он может использоваться для строк заголовка и данных и включать функцию массива assoc, чтобы сделать ваши данные в массив стиля kvp.
//example data
$fields = strparser('"first","second","third","fourth","fifth","sixth","seventh"');
print_r(makeAssocArray($fields, strparser('"asdf","bla\"1","bl,ah2","bl,ah\"3",123,34.234,"k;jsdfj ;alsjf;"')));
//do something like this
$fields = strparser(<csvfirstline>);
foreach ($lines as $line)
$data = makeAssocArray($fields, strparser($line));
function strparser($string, $div = ",", $qual = "\"", $esc = "\") {
$buff = "";
$data = array();
$isQual = false; //the result will be a qualifier
$inQual = false; //currently parseing inside qualifier
//itereate through string each byte
for ($i = 0; $i < strlen($string); $i++) {
switch ($string[$i]) {
case $esc:
//add next byte to buffer and skip it
$buff .= $string[$i+1];
$i++;
break;
case $qual:
//see if this is escaped qualifier
if (!$inQual) {
$isQual = true;
$inQual = true;
break;
} else {
$inQual = false; //done parseing qualifier
break;
}
case $div:
if (!$inQual) {
$data[] = $buff; //add value to data
$buff = ""; //reset buffer
break;
}
default:
$buff .= $string[$i];
}
}
//get last item as it doesnt have a divider
$data[] = $buff;
return $data;
}
function makeAssocArray($fields, $data) {
foreach ($fields as $key => $field)
$array[$field] = $data[$key];
return $array;
}
Если это может быть грязно и быстро. Я бы просто использовал http://php.net/manual/en/function.exec.php чтобы передать его и использовать sed и awk (http://shop.oreilly.com/product/9781565922259.do) разобрать. Я знаю, что вы хотели использовать парсер php. Я пробовал раньше и потерпел неудачу просто потому, что его не вокально о своих ошибках. Надеюсь, это поможет. Удача.