|
 3.5 Кб |
|
| Здравствуйте,
У меня не получается адаптировать парсер csv под свой прайс...
как ни пытался ничего не выход. Прошу вашей помощи. У меня уже как всегда "петух клюнул".
прайсов куча и они все по структуре одинаковы. пример прайса в аттаче | |
|
|
|
|
|
|
|
для: 27
(19.03.2007 в 12:03)
| | так а в чем проблема то? | |
|
|
|
|
|
|
|
для: KPETuH
(19.03.2007 в 12:04)
| | в прайсе были запятые, я их заменил на пробелы и сохранил как csv c разделителями - запятыми (другого пункта нет). Затем пытаюсь читать файл, он читает криво.
вот код парсера:
<?php
// Ïîëó÷àåì ïåðåìåíóþ ê äåéñòâèþ
$w = $_GET['w'];
// Åñëè ïåðåìåííàÿ $w íå ïóñòà, ôîðìèðóåì html êîä òàáëèöû
if(($w=='readcsv'))
{
// Ïðîâåðÿåì ïîëÿ ôîðìû íà ñîîòâåòñâèå
if(empty($_FILES['filename']['tmp_name'])) echo "Ââåäèòå ïóòü ê ôàéëó";
// Îòêðûâàåì ïåðåäàííûé ôàéë
if(!($fp = fopen($_FILES['filename']['tmp_name'],"rb")))
{
echo "<p>Íåâîçìîæíî îòêðûòü ôàéë.</p>";
exit();
}
// ×èòàåì ñîäåðæèìîå ôàéëà â ïðîìåæóòî÷íûé áóôåð - $buffer
$buffer = fread($fp,filesize($_FILES['filename']['tmp_name']));
// Çàêðûâàåì ôàéë
fclose($fp);
// Åñëè èìåþòñÿ ïóñòûå ïîçèöèè, çàìåíÿåì èõ ïðî÷åðêîì
$buffer = str_replace($_POST['separator'].$_POST['separator'], $_POST['separator']."-".$_POST['separator'],$buffer);
$buffer = str_replace("\n".$_POST['separator'],"\n-".$_POST['separator'], $buffer);
// Çàìåíÿåì ïðÿìûå êàâû÷êè îáðàòíûìè
$buffer = str_replace("'", "`",$buffer);
// Ðàçáèâàåì ôàéë ïî ñòðîêàì, êàæäóþ ñòðîêó ôàéëà ïîìåùàåì â îòäåëüíûé
// ýëåìåíò ïðîìåæóòî÷íîãî ìàññèâà $strtmp
$tok = strtok($buffer,"\n");
$strtmp[] = $tok;
while ($tok)
{
$tok = strtok("\n");
$strtmp[] = $tok;
}
// Íà÷èíàåì ôîðìèðîâàíèå òàáëèöû
// Ðàçáèâàåì ñòðîêó ïî îòäåëüíûì ñëîâàì, èñïîëüçóÿ
// ðàçäåëèòåëü $_POST['separator']
foreach($strtmp as $value)
{
// Åñëè ñòðîêà ïóñòàÿ âûõîäèì èç öèêëà
if(trim($value)=="") break;
// Íà÷èíàåì ôîðìèðîâàíèå ñòðîêè òàáëèöû
$strtmp = strtok($value, $_POST['separator']);
while($strtmp = strtok($_POST['separator']))
{
$strtmp = explode($_POST['separator'],$strtmp);
$name = $strtmp[0];
$price = $strtmp[1];
$phone = $strtmp[2];
$company = $strtmp[3];
echo $name." ".$price." ".$phone." ".$company." <br> <br> ";
}
}
echo "OK";
}
else {
echo "<form enctype='multipart/form-data' action='csv.php?w=readcsv' method='post'>
<table>
<tr>
<td>
ôàéë
</td>
<td>
<input size='61' type='file' name='filename'>
</td>
</tr>
<tr>
<td>
ðàçäåëèòåëü
</td>
<td>
<input size='1' type='text' name='separator' value=';'>
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type='submit' value='Èìïîðòèðîâàòü'>
</td>
</tr>
</table>
</form>";
}
?>
|
| |
|
|
|
|
|
|
|
для: 27
(19.03.2007 в 12:03)
| | пользуйтесь функцией fgetcsv() - не изобретайте велосипед... | |
|
|
|
|
|
|
|
для: 27
(19.03.2007 в 12:03)
| | Вот этот код у меня прекрасно работает:
<?php
$w = $_GET['w'];
if(($w=='readcsv'))
{
if(empty($_FILES['filename']['tmp_name'])) echo "Типа файла несуществует";
$fp=file($_FILES['filename']['tmp_name']);
foreach ($fp as $str)
{
$mass=explode($_POST['separator'],trim($str));
echo $mass[0]." ".$mass[1]." ".$mass[2]." ".$mass[3]."<br>";
}
echo "OK";
}
else {
echo "<form enctype='multipart/form-data' action='?w=readcsv' method='post'>
<table>
<tr>
<td>
Файл
</td>
<td>
<input size='61' type='file' name='filename'>
</td>
</tr>
<tr>
<td>
Разделитель
</td>
<td>
<input size='1' type='text' name='separator' value=';'>
</td>
</tr>
<tr>
<td>
</td>
<td>
<input type='submit' value='Нажми меня'>
</td>
</tr>
</table>
</form>";
}
?>
|
| |
|
|
|
|
|
|
|
для: KPETuH
(19.03.2007 в 12:37)
| | Очень благодарен, вылечило! | |
|
|
|
|
|
|
|
для: 27
(19.03.2007 в 15:08)
| | такой подход вылечит ненадолго.
Первая же точка с запятой среди данных, либо поле, где встречаются кавычки, и этот скрипт сядет в лужу. | |
|
|
|