Jump to content
  • 0

Работа со строками


fiver
 Share

Question

Здравствуйте!

Столкнулся с задачей переноса данных из exel в уже существующую БД.

Да вот незадача, нихрена не умею работать со строками.

Возникает куча вопросов.

Я понимаю, что работа со стоками это важный атрибут php, но вот с опытом беда.

Задачка такая, преобразовать строку в переменные которые я смог бы внести в БД.

Строка имеет вид:

$value = "2;Цветной бульвар м.;5п;Печатников пер.;3;2/6 М;70,6/40/15;Б;П+Г;"

что к чему: 2- кол-во комнат, 5п - 5 минут пешком от метро, 2/6 М - 2 этаж 6 эт.зд. монолитного, 60/40/15 - площадь общ./жил/кухня, Б - балкон, П+Г (лифты пассажирски и грузовой).

Ну там еще куча всего в строке, но хотя бы разобраться с этим.

надо получить:

$kol-komnat = 2;

$metro = 'Цветной бульвар';

$minut-ot-metro = 5;

$kak = 'пешком';

$ul = 'Печатников пер.';

$dom = '3';

$etazh = 2;

$etazhnost = 6;

$zdanie = 'monolit';

$sq-ob = 60;

$sq-zh = 40;

$sq-kuh = 15;

$balkon = 'yes';

$lift-pas = 'yes';

$lift-gruz = 'yes';

ну и т.д, т.п.

Готов разобрать каждый шаг отдельно.

Например шаг 1 - $kol-komnat = 2;

Я сделал так:

$kkom = substr($value, 0, strpos($value,';'));

т.е. присвоил значение с 0 символа до первой ;

На этом знания мои иссякли.

Что бы извлечь метро, надо вернуть строку от первой ; до второй ;, потом убрать м., потом убрать пробелы с начала и конца.

Все могу, кроме как вернуть значение второй ;

Link to comment
Share on other sites

Recommended Posts

  • 0

Если значения в строке value идут в строго определенном порядке и розделены ";", то можно разбить ее на массив при помощи функции explode(';', $value), а потом уже заносить в переменные индексированные элементы массива


$blablalba = explode (';', $value)
$kol-komnat = $blablalba[0]
..........
$lift-gruz = $blablalba[n]

Link to comment
Share on other sites

  • 0

Если значения в строке value идут в строго определенном порядке и розделены ";", то можно разбить ее на массив при помощи функции explode(';', $value), а потом уже заносить в переменные индексированные элементы массива


$blablalba = explode (';', $value)
$kol-komnat = $blablalba[0]
..........
$lift-gruz = $blablalba[n]

Вас понял.

А я вот нарыл вот такую функцию

$vtok = strtok($value, ';');

while ($vtok)

{

echo $vtok;

echo "<br>";

$vtok = strtok(";");

}

тоже получается разбил на массив.

Но если пишу

echo $vtok[1];

Выводится какая то хренатень.

А так все выводится прям от ; к ;

Link to comment
Share on other sites

  • 0

как я понял данная функция не формирует индексированный массив, по этому echo $vtok[1] - не правильная запись, так же функция для дальнейшего разделения требует повторного вызова.

http://php.su/functions/?strtok

http://php.su/functions/?split

http://php.su/functions/?explode

http://php.su/functions/?preg-split

почитаете документацию, может какой то вариант подойдет вам лучше

Link to comment
Share on other sites

  • 0

Предложенный ранее $blablalba = explode (';', $value) работает как надо.

теперь возникают частые нюансы.

например разбить 5п или 15т на 2 переменных 1-я только цифра, и 2-я в зависимости от буквы п или т = пешком или транспортом.

Только цифру можно оставить например 2 раза воспользовавшись функцией str_replace и заменив т и п на '' пусто.

А с т и п, проверить наличие на символ т, если есть, то транспортом, если нет, то значит пешком.

Это вот с моей точки зрения, как можно сделать.

Просто интересно узнать, а как правильно и оптимально это сделать.

И вообще вот такая запись работает, но имеет ли она право на жизнь, или можно сделать все проще?


$min_ot_m = trim(str_replace('п','',str_replace('т','',$vtok[2])));

Edited by fiver
Link to comment
Share on other sites

  • 0

не знаю на сколько это правильно и оптимально


if(strpos($blablalba[2],'т')){
$minut-ot-metro = str_replace ('т', ' ', $blablalba[2]);
$kak = 'Транспортом';
}
else {
$minut-ot-metro = str_replace ('п', ' ', $blablalba[2]);
$kak = 'Пешком';
}

на работоспособность и правильность не проверял, может что то накосячил с аргументами, но суть думаю ясна

думаю не логично заменять символ на пробел, а потом этот пробел удалять тримом - ведь он может удалять не только пробелы, но и символы которые ему указать 2м параметром


if(strpos($blablalba[2],'т')){
$minut-ot-metro = trim ($blablalba[2], 'т');
$kak = 'Транспортом';
}
else {
$minut-ot-metro = trim($blablalba[2], 'п');
$kak = 'Пешком';
}

так будет более красиво

Edited by Avalon4eg
Link to comment
Share on other sites

  • 0

не знаю на сколько это правильно и оптимально


if(strpos($blablalba[2],'т')){
$minut-ot-metro = str_replace ('т', ' ', $blablalba[2]);
$kak = 'Транспортом';
}
else {
$minut-ot-metro = str_replace ('п', ' ', $blablalba[2]);
$kak = 'Пешком';
}

на работоспособность и правильность не проверял, может что то накосячил с аргументами, но суть думаю ясна

думаю не логично заменять символ на пробел, а потом этот пробел удалять тримом - ведь он может удалять не только пробелы, но и символы которые ему указать 2м параметром


if(strpos($blablalba[2],'т')){
$minut-ot-metro = trim ($blablalba[2], 'т');
$kak = 'Транспортом';
}
else {
$minut-ot-metro = trim($blablalba[2], 'п');
$kak = 'Пешком';
}

так будет более красиво

Второй вариант выглядит более симпотно.

Для сравнения как это сделал я сам.

Не судите строго :)


$min_ot_m = trim(str_replace('п','',str_replace('т','',$vtok[2])));

$kak_ot_m = strpos($vtok[2], 'п');
if ($kak_ot_m === false) $kak_ot = 'Транспортом';
else $kak_ot = 'Пешком';

Что касаемо замены, я менял не на пробел, а на пустой символ, т.е. просто удалял (в ковычках нет ничего '' , а не ' ').

а результат функции strpos проверял на истину ложь.

Edited by fiver
Link to comment
Share on other sites

  • 0

главное что работает =)

хотя

trim(str_replace('п','',str_replace('т','',$vtok[2])));

меня пугает =)

а не секрет зачем тогда trim

trim, что бы удалить пробелы спереди и сзади. После удаления п или т, после цифры образуется пробел, который до этого разделял цифру и букву.

Link to comment
Share on other sites

  • 0

Вот тут было немного времени и накидал маленькую функцию для преобразования строки.. Может чуть увлёкся, но вроде заставил себя остановиться.. А вообще, строка не может наверное быть одна, а значит нужно ещё добавить цикл для обработки массива.. И ещё вообще-то можно сразу забирать данные из файла. Ну и т.д :)

вот собственно код, весь комментарий в коде

// одна строка из базы
$a = "2;Цветной бульвар м.;5п;Печатников пер.;3;2/6м;60/40/15;Б;ПГ";

// получаем массив с данными
$array_data = getData($a);

// результат
echo '<pre>';
print_r($array_data);
echo '</pre>';

/**
* Делаем отдельную функцию для обработки строки
* @param string $str - строка с данными
* @return array - массив с данными
*/
function getData($str){
// присваиваем сразу всем переменным их значения
list($result['kol_komnat'],
$result['metro'],
$result['minut_ot_metro'],
$result['ul'],
$result['dom'],
$etaz,
$sq_ob,
$balkon,
$lift) = explode(';', $str);

// получаем переменную $kak
$result['kak'] = (strpos($result['minut_ot_metro'], 'п')) ? 'Пешком' : 'Транспортом';

// удаляем буквы из значения
$result['minut_ot_metro'] = intval($result['minut_ot_metro']);

// получаем все данные по этажу и зданию
preg_match('#^([\d]*)\/([\d]*)([а-я]*)$#iu', $etaz, $tmp);
// этаж
$result['etaz'] = $tmp[1];
// этажность
$result['etaznast'] = $tmp[2];
// здание
if($tmp[3] == 'м' or $tmp[3] == 'М')
$result['zdanie'] = "Моноглит";
elseif($tmp[3] == 'к' or $tmp[3] == 'К')
$result['zdanie'] = "Кирпич";
elseif($tmp[3] == 'д' or $tmp[3] == 'Д')
$result['zdanie'] = "Дерево";
else
$result['zdanie'] = "Иное";

// получаем данные по квартире
list($result['sq_ob'], $result['sq_zh'], $result['sq_kuh']) = explode('/', $sq_ob);

// получаем данные по балкону
if($balkon == 'б' or $balkon == 'Б')
$result['balkon'] = "Есть (балкон)";
elseif($balkon == 'л' or $balkon == 'Л')
$result['balkon'] = "Есть (лоджия)";
else
$result['balkon'] = "Нет";

// получсаем данные по лифту
if(strlen($lift)== 2)
$result['lift'] = "Пассажирский и грузовой";
elseif(strpos($lift, 'п') or strpos($lift, 'П'))
$result['lift'] = "Пассажирский";
elseif(strpos($lift, 'г') or strpos($lift, 'Г'))
$result['lift'] = "Грузовой";
else
$result['lift'] = "Нет";

// возврат результата
return $result;
}

PS

ребят, ну фигней страдаете, ну... вот же, куча решений! ;)

Зря ссылки делаешь на поисковики ;) так ты с форума и людей и поисковых пауков уводишь, т.е. только минус для рекламы.. Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

Зря ссылки делаешь на поисковики ;) так ты с форума и людей и поисковых пауков уводишь, т.е. только минус для рекламы..

что за бред? :blink:

т.е. все пользователи форума, которые дают ссылки на материалы в т.ч. и гугл - уводят людей и пауков с форума? :dash:

а ты не в курсе что на форуме в теге <a> стоит nofollow? ;)

да в любом случае, я просто показал человеку как и главное ЧТО нужно искать, а то тут изобретают велик понимаешь, это ж самая настоящая работа с .csv

Link to comment
Share on other sites

  • 0

это ж самая настоящая работа с .csv

Ну конечно ДА(!) Просто не совсем понятно как эти данные поступают. А может их на дискетах по одной строке привозят :D .. Да и иногда нужно и мозги по разминать :) Тем более, данные не структуированы, т.ч. всё равно нужна обработка..

PS

я про ссылки на сами поисковики, а не на ссылка на конкретные материалы :) И я против ссылаться на другие ресурсы (ну за исключением конечно явно документации и т.п.). Лучше тут привести пример, чтобы на других форумах делали ссылки на этот B)

Link to comment
Share on other sites

  • 0

это ж самая настоящая работа с .csv

Ну конечно ДА(!) Просто не совсем понятно как эти данные поступают. А может их на дискетах по одной строке привозят :D .. Да и иногда нужно и мозги по разминать :) Тем более, данные не структуированы, т.ч. всё равно нужна обработка..

PS

я про ссылки на сами поисковики, а не на ссылка на конкретные материалы :) И я против ссылаться на другие ресурсы (ну за исключением конечно явно документации и т.п.). Лучше тут привести пример, чтобы на других форумах делали ссылки на этот B)

мне лениво тут рассказывать и объяснять однотипные стандартные задачи, решения которых в нете - пруд пруди, так что если бы кто-то тут привел код решения, то оно было бы не просто одним из возможно 100 000-ых в нете, а и 100-ым на этом форуме.

Link to comment
Share on other sites

  • 0

:rofl: так я же сказал.. было немножко свободного времи

Кстати, жалко что на этом форуме нет функции Ajax-подкачки схожих тем.. Т.е. человек вводит название темы, а ему тут же показываются похожие. Как на Винграде. Очень удобно

Link to comment
Share on other sites

  • 0

Ну да, работа с CVS.

Я и извлекаю из cvs файла данные, бью на строки и вгоняю эти строки в переменную, которую потом потрошу на нужные мне составляющие, которые вношу в нужном виде в БД. Так что бы в результате и сортировка работала и поиск по данным и прочее. Еще есть автоопределение района и АО по названию улицы и т.п.

Смысл не в том, что бы взять готовое решение. Смысл в том, что бы научиться работать со строками, отсекать лишнее, изымать нужное. Можно это и самому освоить. Что я и делаю параллельно общению на форуме. Но всегда хочется узнать как это делают профи, что бы оценить свои решения и оптимизировать их.

Поэтому большое спасибо всем кто откликнулся.

По поводу в "в теге <a> стоит nofollow", обратил внимание, что почему то не всегда это срабатывает.

Вот если параметр применить ко всей странице, то результат есть, а к одной ссылке, частенько не работает.

Т.е. делал ссылки с одного своего сайта на другой с nofollow, а когда захожу в мои сайты в яндекс и смотрю внешние ссылки, то ссылка там есть.

Да и с форумов ссылки тоже всегда добавляются.

Link to comment
Share on other sites

  • 0

Смысл в том, что бы научиться работать со строками, отсекать лишнее, изымать нужное.

Ну так спрашивай.. Я в своём примере несколько подходов к обработки данных в строке предложил ;)
Link to comment
Share on other sites

  • 0

Смысл в том, что бы научиться работать со строками, отсекать лишнее, изымать нужное.

Ну так спрашивай.. Я в своём примере несколько подходов к обработки данных в строке предложил ;)

То что сделал ты, круто.

Кратенько, сам бы я до такого не дошел. Это надо видеть готовые примеры и на них учиться.

Вот такой еще вопрос.

У меня есть таблица, которая содержит названия всех улиц Москвы, и относит их соответственно к нужным АО и районам.

Но данные содержатся в таком виде -

Большой Николопесковский переулок

Ленина улица

Лесная 2-я улица

А в ексель улицы в виде

Большой Николопесковский пер.

Ленина ул.

2-я Лесная ул.

С пер. ул. пр. пл. и т.п. я решил проблему просто.

С помощью str_replace заменяю их на полное наименование, т.е. ул. на улица и т.д.

Там немного всего, еще тупики, набережные, мосты, проезды, поселки ну и т.д.

А вот как быть с Лесная 2-я на 2-я Лесная

Или Микраройон 3-й Зеленоград на

3-й Микраройон Зеленограда.

У меня на данный момент 4243 улиц, и частенько встречаются перемена мест в названиях.

Link to comment
Share on other sites

  • 0

ну это уже вопрос другой темы.. но вот этот код сможет помочь немного

// массив первичных названий улиц
$a = array(
"Лесная 2-я",
"Совхозный переулок 1-й",
"Ленина",
"Микрорайон 3-й Зеленоград",
"Кутозова 2-й Химки"
);

// получаем массив с новыми данными
$b = getRenameStreet($a);

// пример результата
echo '<h3>Исходник:</h3><pre>';
print_r($a);
echo '</pre>';
echo '<hr><h3>Результат:</h3><pre>';
print_r($;
echo '</pre>';

/**
* Делаем отдельную функцию перевёртывания названий улиц
* @param array $arr - массив старых названий улиц
* @return array - массив новых названий улиц
*/
function getRenameStreet($arr){
$result = array();
// перебираем весь архив
foreach($arr as $str){
// условие разбитие
$pat = "#^([а-яА-ЯёЁ ]+)\s*([\d]-[йЙяЯ])?\s*(.*)$#iu";

// разбиваем строку
preg_match($pat, $str, $tmp);

// собираем новую строку

// проверяем есть ли числовая переменная
$str = ($tmp[2] != '') ? $tmp[2] . ' ' . trim($tmp[1]) : trim($tmp[1]);

// проверяем есть ли населённый пункт
$str = ($tmp[3] != '') ? $str . ', ' . $tmp[3] : $str;

// добовляем в новый массив
$result[] = $str;
}

// возврат результата
return $result;
}

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

i - символы не зависят от регистра

u - строка рассматривается в кодировке UTF-8, просто у меня все проекты в этой кодировке, уже пишу машинально :)

fiver, код то работает? :)

Edited by Gold Dragon
Link to comment
Share on other sites

  • 0

Привет. За код спасибо.

Что то работает, что то нет.

В основном не работает, но сделано красиво, я подучился, что то подшаманить пришлось.

Как кодировку сменить на 1251? Какую букву надо ставить? w?

Link to comment
Share on other sites

  • 0

У меня еще такой вопрос возник.

Функция strtok разбивает строку на подстроки, по указанному разделителю.

А как например разбить строку на отдельные символы.

Например 123

на $a[1]=1,$a[2]=2, $a[3]=3.

Там же нет разделителя.

Все вопрос снят, нашел - str_split

Edited by fiver
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy