Помогите с разбором csv файла, не могу понять из за чего оши

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
badenkov
Сообщения: 79
Зарегистрирован: 2009.06.22, 09:05
Откуда: Ижевск
Контактная информация:

Помогите с разбором csv файла, не могу понять из за чего оши

Сообщение badenkov »

Проблема следующая:
Беру csv файл и разбираю его.
Разобрав первую запись беру первый элемент масива и преобразую его в int. И он почему то превращается в 0. Видимо кроме цифр попадается еще какой то символ. Не могу понять, откуда он появляется.

Исходный файл имеет такой вид:

1;1;"Гель""JessNail"" (прозрачный,натуральный,белый) 15 гр.";280
2;1;"Гель ""RuNail"" (прозрачный,белый) 15 гр.";450
3;1;"Био-гель ""JastNail"" (комуфлирующий,прозрачный,розовый)";900
4;1;"Гель IBD Clear Gel 14 гр.";850
5;1;"Гель IBD Clear Gel 114 гр.";2500
6;1;"ibd Builder Gel, 14 гр. -строительный гель(прозрачный,ультра белый)";850

Разбираю его таким образом:

Код: Выделить всё

$content = file_get_contents($file);
$items = explode("\n", $content);
foreach ($items as $item)
{
    if (!empty($item) {
       $par = explode(';', $item);
       // Ну и дальше я присваиваю элементы свойствам модели, предварительно прогнав их через CPropertyValue
       ...
    }
}
 
tima_ben
Сообщения: 14
Зарегистрирован: 2010.01.21, 04:53

Re: Помогите с разбором csv файла, не могу понять из за чего оши

Сообщение tima_ben »

Возможно в файле конец строки не в точности равен "\n"
из за этого может быть косяк, если второй элемент нормально в инет превращается то сто-пудово конец строки не ="\n"
Аватара пользователя
badenkov
Сообщения: 79
Зарегистрирован: 2009.06.22, 09:05
Откуда: Ижевск
Контактная информация:

Re: Помогите с разбором csv файла, не могу понять из за чего оши

Сообщение badenkov »

Там не в переносе строк проблемы. На конце у меня \r\n, хотя можно разбить на строки и по \n, а потом все лишнее удалить trim-ом. Проблема в том, что в первой строке перед первой цифрой у меня какой-то непонятно от куда взявшийся символ взялся (какая то точка, только не с низу, а посередине), и поэтому приведение типов неправильно работает.

Кстати спасибо за помощь, совет Sam Dark-а помог. Но хотелось бы все же понять, откуда символ появился.

csv файл генерируется OpenOffice-ом, кодировка utf8. С другими кодировками не пробовал, но думаю может из за кодировки. Вроде в php с этим какая то запутанность, отдельные функции mb_ для работы со строками utf8 даже есть.
Simpliest
Сообщения: 19
Зарегистрирован: 2010.01.17, 01:42

Re: Помогите с разбором csv файла, не могу понять из за чего оши

Сообщение Simpliest »

Это не в PHP запутанность.
А в ваших навыках.

Скорее всего файл у вас формируется с BOM. Попробуйте просмотреть его в любом редакторе в 16-тиричных кодах.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: Помогите с разбором csv файла, не могу понять из за чего оши

Сообщение Ekstazi »

Рабочий код из одного из проектов(писался под php4):

Код: Выделить всё

            //Проверяем правильность формата прайса
                $price=file_get_contents($_FILES['price']['tmp_name']['csv']);
                $price=iconv("CP1251", "UTF-8", $price);
            //Получаем все строки
                $price=preg_split("/[;]*\s*[\n\r]+\s*/",$price);
            //Удаляем последний элемент если он пустой
                if(empty($price[count($price)-1])) unset($price[count($price)-1]);
            //Флаг проверки
                $flag=1;
            //Список всех товаров
                $items=array();
            //Функция подготовки элементов внутри кавычек
                function _prep($matches){
                    $matches[1]=str_replace(';',"\x02",$matches[1]);
                    return $matches[1];
                }
            //Проход по строкам
                foreach($price as $line){
                    $l=$line;
                    //echo $l.'<br>';
                //Кавычки в спец формат перегоняем
                    $l=str_replace('""',"\x01",$l);
                //Подготавливаем элементы внутри кавычек
                    $l=preg_replace_callback('/"([^"]*)"/',"_prep",$l);
                //Разделяем
                    $item=preg_split('~\s*;\s*~u',$l);
                    if(count($item)!=3){
                        $flag=0;
                        $error='Неверный формат csv файла.\nПроблема в строке:'.addslashes($line);
                        break;
                    }
                    
                //Потобработка
                    foreach($item as $k=>$v){
                        $item[$k]=str_replace("\x01",'"',$item[$k]);
                        $item[$k]=str_replace("\x02",';',$item[$k]);
                    }
                    if(!preg_match('/^\d+.{0,1}$/',$item[2])){
                        $flag=0;
                        $error='Неверный формат цены.\nПроблема в строке:'.addslashes($line);
                        break;
                    }
                    $items[]=$item;
                }
 
В $items отпарсеный файл. Проверено на MS office
Ответить