Блог Дмитрия Волотко - Это нормально © Подпишись на обновления!

Обработка CSV с помощью PHP

Сегодня возникла необходимость обработать CSV файлик. Не просто вывести информацию на экран, а плавно встроить её в сайт. Как мне показалось – вопрос плохо освещён в Сети. Поиски по Яндексу что-то существенное не принесли, решил написать сам. Скрипт получился неказистым, возможно подход неправильный, но тем не менее он больше отвечает моим требованиям чем те, что я нашёл в поисковиках.

Давайте сначала определимся с тем, что такое CSV. Как говорит Википедия, это:

CSV (от англ. Comma Separated Values — значения, разделённые запятыми) — это текстовый формат, предназначенный для представления табличных данных. Каждая строка файла — это одна строка таблицы. Значения отдельных колонок разделяются разделительным символом (delimiter), например, запятой (,), точкой с запятой(;), символом табуляции. Текстовые значения обрамляются символом двойные кавычки ("); если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд.

Какой будет разделитель, нам всё равно. Мы не будем использовать fgetcsv, ибо мне неудобно работать с ней.

Строка нашего, экспериментального CSV-файла будет примерно такой:

7;Геленджик ;Орджоникидзе;2;1/3 эт.;53;38;9;66;евроремонт с мебелью;5 млн.руб.

А ниже скрипт, который я написал:

function csv2lines($lines2file) {
$lines = file($lines2file);
foreach ($lines as $line_num => $line) {
$data = $line;
list($number, $city, $street, $rooms, $float, $n1, $n2, $n3, $blabla, $comment, $prise) = explode(“;”, $data);
echo ”
<table class=\”\” width=\”100%\”><tbody>
<tr>
<td width=\”40%\”>”. $street .”</td>
<td width=\”60%\”>”. $prise .”</td>
</tr>
<tr>
<td>Этаж: “. $float .”
Комнаты: “. $rooms .”
Площадь: “. $n1 .” “. $n2 .” / “. $n3 .” м<sup>2</sup></td>
<td>”. $comment .”</td>
</tr>
</tbody></table>
“;
}
}

csv2lines(‘name.csv’);

Думаю добавить проверки на пустые переменные или исправить функцию – несложно. Она элементарная.

Так же можно почитать:

# 16 April 2008 в 16:29

Михаил

$prise – это цена? тогда пишется price.

у меня была задача экспорта данных из 10 мегового файла в MySQL. при том что хостинг был виртуальным. мне лень писать куда-то.
было бы здесь такое решение, было бы полезно. а так – ерунда.

# 16 April 2008 в 20:02

Волотко Дмитрий

2_Михаил, а поправить ф-ю несложно, для поставленной задачи.
По поводу prise, да, цена :)

# 17 April 2008 в 5:49

Vadyacorp

file() берет сразу весь файл, что не есть хорошо при больших файлах.

# 17 April 2008 в 7:17

Волотко Дмитрий

2_Vadyacorp, согласен.

# 25 July 2009 в 9:15

Dr Lines

Вы забываете, что можно данные могут тоже содержать знак ( ; )
Как толко возникнет такая ситуация, тутже вылезит глюк.

Вот данные для примера (В обоих случаях количество колонок одинаковое, но explode слепо выведет еще одну лушнюю).
Эксмо;1917РевСп;Стариков Н.В.;”Преданная Россия. Наши “”союзники”" от Бор”;105,00;9785699237692;1917 революция или спецоперация;12;
Эксмо;BookРевол;Буковски Ч.;”Юг без признаков севера;sad”;195,00;9785699284320;Bookреволюция;32;

строки ячеек, содержащие спец-символы типа ( ; ) или ( ” ), заключаются в двойные кавычки автоматически! Приэтом сами кавычки не являются данными этой ячейки. Все это должен парсить ваш скрипт.

# 28 April 2011 в 5:23

Teimos

А как же fgetcsv() и fputcsv() ?



* Должны быть заполнены.
Из-за дикого спама, и нежелания ставить капчу оставлять ссылку у комментария вообще нельзя. Точно так же нельзя оставлять ссылки в теле комментария.