view-components / grids

MIT License
86 stars 17 forks source link

Removing double spaces and new lines from CSV #29

Closed sanasol closed 7 years ago

sanasol commented 7 years ago

Need do some string cleanup. Remove >1 spaces and all new lines, trailing spaces. To avoid incorrect display in Excel/Calc columns after html code stripping.

OO Calc: http://dsro.ru/gyazo/images/046186fb43d10e6092e05b7fbfab.png MS Excel: http://dsro.ru/gyazo/images/c20a37008265555a18f7ccf55e99.png

sanasol commented 7 years ago

Before and after cleaning

http://dsro.ru/gyazo/images/582b3432ce58641d6a6ee1cb6c1e.png

Nayjest commented 7 years ago

Hi @S-anasol! First of all, thanks for contribution.

I suggest trim() not works for you because you have   in your strings. Can you check that? Or share any string with that buggy spaces.

$str = preg_replace('/\s+/', ' ', $str); is not a best solution becouse string may have >1 space inside by design.

I found info regarding issue with "&nbsp" here: http://php.net/manual/ru/function.html-entity-decode.php Quote:

Note:
You might wonder why trim(html_entity_decode(' ')); doesn't reduce the string to an empty string, that's because the ' ' entity is not ASCII code 32 (which is stripped by trim()) but ASCII code 160 (0xa0) in the default ISO 8859-1 encoding.

and solution here:

http://php.net/manual/en/function.trim.php#98812

So, maybe it wold be better just replace trim($str) to trim($str, " \t\n\r\0\x0B" . chr(0xC2).chr(0xA0)) instead of doing preg_replace. What do you think?

Can you check this code?

Nayjest commented 7 years ago

Upd: можно по-русски, если что :)

Nayjest commented 7 years ago

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

trim($str, " \t\n\r\0\x0B" . chr(0xC2).chr(0xA0))
sanasol commented 7 years ago

I suggest trim() not works for you

Кто сказал что не работает? У меня всё хорошо с trim и остальным :)

$str = preg_replace('/\s+/', ' ', $str); is not a best solution

Я считал что это лучшее решение по простоте и функциональности, но не по по используемым ресурсам конечно :) Вообще регулярки не люблю.

may have >1 space inside by design.

ни разу не встречал такого. Так чтоб по два пробела(или тем более больше) между словами было. Хотя бы потому что html в браузере отображает только один пробел всегда, даже если 10 поставить.

trim($str, " \t\n\r\0\x0B" . chr(0xC2).chr(0xA0))

Даже никогда не заглядывал в доку trim, не знал что там есть какие-то опции. Проверил такой вариант, получилось грязно.

ID;"Company name";City/Brgy;Owner;Invoice;Receipt;"Deposit Slip";Status;Option;Actions
25;"CYBER ARTS AND PRINTS";"QUEZON CITY/Bagumbayan";"CYBER ARTS AND PRINTS";Invoice;"No receipt";"10-25-16 | 01:43";Active;Lifetime;"Renewal

Edit

View

  Delete"
37;

Так что все-таки \s+ отрабатывает лучше всего. По крайней мере других решений я не встречал для этой задачи.

Nayjest commented 7 years ago

Ок, мержу

Nayjest commented 7 years ago

Released in v0.5.8