Как спарсить такую csv строку?



  • Есть у меня такая csv строка.

    YES,492.79,"Samsung Galaxy: S5, 16GB, White (Verizon Wireless)",3677,4.4 out of 5 stars,BKNB9Jhg,1
    

    Разделитель запятая. Паршу строку стандартным способом BAS, он правильно парсит, не учитывает те запятые что в кавичках. Но вот двоеточие учитывает, и делит также по двоеточию. Так не подходит. Нужно чтоб данные спарсились в переменные в таком виде:

    Переменная 1 = YES
    Переменная 2 = 492.79
    Переменная 3 = "Samsung Galaxy: S5, 16GB, White (Verizon Wireless)"
    Переменная 4 = 3677
    Переменная 5 = 4.4 out of 5 stars
    Переменная 6 = BKNB9Jhg
    Переменная 7 = 1
    

    Пробовал парсить через список, но список учитывает все запятые, даже те что в кавычках.
    Подскажите, как можно спарсить данную строку в переменные как в примере выше?



  • @Gang said in Как спарсить такую csv строку?:

    YES,492.79,"Samsung Galaxy: S5, 16GB, White (Verizon Wireless)",3677,4.4 out of 5 stars,BKNB9Jhg,1

    но парсить строку из инструментов обрабатывает это верно.
    может быть гдето вместо двойной кавычки апострофы два?
    0_1527943402516_3.gif



  • @Gang Самое первое, что приходит в голову, это изначально менять двоеточие на любой другой знак.
    Скажем : на |, ; на `, а после поменять обратно.



  • @Gang Если всесто запятых будеи двоеточие - все будет хорошо парсится, то что в кавычках - бедет в отдельной переменной



  • @ruzne Да, действительно, эту строку парсит правильно. Это я перестарался и для примера сделал нормальную строку. Вот взял рабочую строку которая так не парсится

    YES,364.99,GoPro HERO3: Black Edition,934,4.2 out of 5 stars,HJIHJKLJJHH,.16,CHDHX-301,"October 22, 2012"
    

    У меня разбивает GoPro HERO3 в одну переменную, а Black Edition в другую.

    @Fox Тоже о таком думал, но там настолько данные разнообразны в этой табличке, вдруг какой еще символ появится проблемный. А мне нужно стопроцентный вариант без лишних танцев с бубном)

    @DrPrime к сожалению заказчик не может поменять структуру csv У него только с запятой выгружает его система


  • Banned

    @Gang "вдруг какой еще символ появится проблемный."

    думаю, что набор "проблемных" символов на разбивку ограничен примерно такими " , : ; " следовательно в вашем случае достаточно действительно заменить двоеточие и точку с запятой, а потом сделать map() реверс, но не одним символом, как посоветовали выше (всегда есть риск напороться на наличие такой подстроки/символа в данных), а каким-то своим набором типа <<TCHKZPT>> <<DVTCHK>> либо обозначениями переменных соответствующего значения [[TCHKZPT]] [[DVTCHK]] (что может оказаться еще интереснее)



  • @Gang

    ((\".+\"){1,1}&|[^,]+)
    

    это должно работать, проверять я это конечно не буду,
    что странно вместо & желал поставить ? как признак не жадности, но все ошибки к лучшему

    айч, и за чем я проверял

    /(\".+\")|([^,]+),|([^,]+?)/gU
    

    я думаю

    или

    /(\".+\")|([^,]+?)/gU
    


  • Спасибо всем за костыли) Буду пробовать. Но конечно, хотелось бы видеть в BAS работу с csv файлами с коробки, без лишних запар. Я не говорю уже про полноценный exel. Вот в Зенке, поставил свой разделитель в настройках, и при любых раскладах распарсит csv правильно.



  • @Gang
    еще лучше конвертировать csv в dcv, а именно все поля обернуть в кавычки, проблема решена

    если cvs большой(реально большой) можно получить еще один том войны и мир.


Log in to reply