2013-06-03 2 views
0

Я разбираю CSV-файл с fgetcsv. Я получил CSV-экспорт из установки Magento. Однако это не объяснимо. Вот одна проблематична линия такого экспорта:Заменить дюймы и другие кавычки в CSV, если не следовать или предшествует запятая

200000, Samsung Galaxy S2, $ 399.00,8806085359376, нуль, свободная земля перевозка груза, новое, в наличии, Samsung, "Vivid‧Fast‧Slim Новый GALAXY SII Plus делает вашу жизнь еще более умной! 4.3 "SUPER AMOLED Plus 4.3" SUPER AMOLED Plus дисплей выходит за рамки уже замечательного SUPER AMOLED, чтобы обеспечить улучшенную читаемость, более тонкую конструкцию и лучшее потребление энергии для наилучшего просмотра любого смартфона. -Touch Размер дисплея: 4.3 "Разрешение: 480 x 800pixel Платформа Платформа: Android v4.1 (Jelly Bean) TOUCHWiZ v4.0 Пользовательский интерфейс (до 7 страниц рабочего стола виджета) Band^UMTS (850/900/1900/2100 МГц) + Емкость аккумулятора: 1650 мАч ", мобильный телефон> Производитель> Samsung,

Проблема заключается в использовании " в файле в виде короткой руки для inch и других случаев.

Я ищу RegEx для preg_replace каждой двойной кавычки, за которой не следует или предшествует запятая. Однако мои знания RegEx плохие, и я не могу создать рабочее выражение. Это то, что я думаю, что довольно близко к решению, но я не могу заставить его работать:

private static function _fixQuotesInString($string) 
{ 
    return preg_replace('/(?<!,)"|"(?!,)/', '&quot;', $string); 
} 

Как я, с моим ограниченным знанием, будет читать это, я бы сказал: Если вы нашли двойные кавычки, проверьте, не предшествует ли ему запятая или не запятая, и если да, замените ее на ". Однако опыт показывает, что это не так.

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

+2

Что вы будете делать с этим текстом: «отличный случай, 4.3», samsung « – boisvert

+1

Если вы посмотрите на это, это довольно сложно исправить, так как экспорт явно не придерживается * вообще *, как CSV должен выглядит как. Не проще ли исправить проблему у источника? – Joey

+0

@boisvert Этот худший случай сломает его в любом случае. Я просто хочу сделать из плохой работы. Если ни при каких обстоятельствах не будет восстановлено, пользователю будет предложено исправить его экспорт. Фиксация источника будет невозможна. Старые Magentos экспортируют, как это, и многие используют его. Я просто прошу RegEx обойти прогулку по каждому персонажу, отметив, что это «и правила использования закрытых или закрытых специальных символов». – SebiF

ответ

4

Ваше регулярное выражение заменит как ,", так и ",, потому что они не соответствуют одновременно двум условиям чередования. Вместо этого вы можете просто использовать (?<!,)"(?!,), который требует, чтобы цитата была окружена на ни стороны по запятой.

Обратите внимание, что по-прежнему существуют проблемы с решением в случае, если " следует за запятой, поэтому вы должны изучить эту проблему в своем источнике.

+0

+1 для комментария «посмотреть на источник». Невыраженные d-кавычки в экспорте csv недействительны. –

+0

Вы правы, когда попадаете в корень проблемы, однако я хочу сделать это как можно более устойчивым к плохо отформатированному CSV.Я делаю много проверок, если обнаруженное форматирование действительно работает. Если невозвратимый, пользователю будет предложено изменить его параметры экспорта. Только очень немногие пользователи будут загружать файлы так же плохо, как пример вверху. Ваше решение работает и заменяет правильные цитаты, я мог бы даже следовать вашим объяснениям. Я оставлю это открытым на короткое время, если есть кто-нибудь, у кого есть окончательное решение для синтаксического анализа. :) – SebiF

3

Описание

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

(?:^|,)("?)(.*?)\1(?=,(?!\s)|$)

enter image description here

Группа 2 присваивает каждому из значений, разделенных запятой. Если значение открывается цитатой, то закрывающая цитата, за которой следует ,, за которым не следует пробел, или конец строки требуется для закрытия строки.

PHP Пример кода:

<?php 
$sourcestring="your source string"; 
preg_match_all('/(?:^|,)("?)(.*?)\1(?=,|$)/ims',$sourcestring,$matches); 
echo "<pre>".print_r($matches,true); 
?> 

$matches Array: 
(
    [0] => Array 
     (
      [0] => 200000 
      [1] => ,Samsung Galaxy S2 
      [2] => ,$399.00 
      [3] => ,8806085359376 
      [4] => ,null 
      [5] => ,Free ground shipping 
      [6] => ,New 
      [7] => ,In Stock 
      [8] => ,Samsung 
      [9] => ,"Vivid‧Fast‧Slim The new GALAXY SII Plus makes your life even smarter! 4.3" SUPER AMOLED Plus The 4.3" SUPER AMOLED Plus display goes a step beyond the already remarkable SUPER AMOLED to provide enhanced readability, a slimmer design, and better battery consumption for the best viewing value of any smartphone. Full-Touch Display Size: 4.3" Resolution: 480 x 800pixel Platform Operation Platform: Android v4.1 (Jelly Bean) TOUCHWiZ v4.0 User Interface (upto 7 pages widget desktop) Band^ UMTS(850/900/1900/2100MHz)+ Battery Capacity: 1650mAh" 
      [10] => ,Mobile > Manufacturer > Samsung 
      [11] => , 
     ) 

    [1] => Array 
     (
      [0] => 
      [1] => 
      [2] => 
      [3] => 
      [4] => 
      [5] => 
      [6] => 
      [7] => 
      [8] => 
      [9] => " 
      [10] => 
      [11] => 
     ) 

    [2] => Array 
     (
      [0] => 200000 
      [1] => Samsung Galaxy S2 
      [2] => $399.00 
      [3] => 8806085359376 
      [4] => null 
      [5] => Free ground shipping 
      [6] => New 
      [7] => In Stock 
      [8] => Samsung 
      [9] => Vivid‧Fast‧Slim The new GALAXY SII Plus makes your life even smarter! 4.3" SUPER AMOLED Plus The 4.3" SUPER AMOLED Plus display goes a step beyond the already remarkable SUPER AMOLED to provide enhanced readability, a slimmer design, and better battery consumption for the best viewing value of any smartphone. Full-Touch Display Size: 4.3" Resolution: 480 x 800pixel Platform Operation Platform: Android v4.1 (Jelly Bean) TOUCHWiZ v4.0 User Interface (upto 7 pages widget desktop) Band^ UMTS(850/900/1900/2100MHz)+ Battery Capacity: 1650mAh 
      [10] => Mobile > Manufacturer > Samsung 
      [11] => 
     ) 

) 

Простая замена

Поскольку ваш исходный текст через запятую и запятая разделители не будет иметь никакого окружающее пространство, чтобы решить вопрос с "excellent occasion, 4.3", samsung" вы могли бы использовать

Регулярное выражение: (?<!,)(")(?!,\S) Замените ничем

Пример кода PHP:

<?php 
$sourcestring="your source string"; 
echo preg_replace('/(?<!,)(")(?!,\S)/ims','',$sourcestring); 
?> 

$sourcestring after replacement: 
200000,Samsung Galaxy S2,$399.00,8806085359376,null,Free ground shipping,New,In Stock,Samsung,"Vivid‧Fast‧Slim The new GALAXY SII Plus makes your life even smarter! 4.3 SUPER AMOLED Plus The 4.3 SUPER AMOLED Plus display goes a step beyond the already remarkable SUPER AMOLED to provide enhanced readability, a slimmer design, and better battery consumption for the best viewing value of any smartphone. Full-Touch Display Size: 4.3 Resolution: 480 x 800pixel Platform Operation Platform: Android v4.1 (Jelly Bean) TOUCHWiZ v4.0 User Interface (upto 7 pages widget desktop) Band^ UMTS(850/900/1900/2100MHz)+ Battery Capacity: 1650mAh",Mobile > Manufacturer > Samsung, 
+0

Вау, это ультра. Будет отправлено это в следующей версии анализатора CSV. Благодаря! – SebiF

+0

Спасибо за добрые слова :) –