Как спарсить такую 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
но парсить строку из инструментов обрабатывает это верно.
может быть гдето вместо двойной кавычки апострофы два?
-
@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 У него только с запятой выгружает его система
-
@Gang "вдруг какой еще символ появится проблемный."
думаю, что набор "проблемных" символов на разбивку ограничен примерно такими " , : ; " следовательно в вашем случае достаточно действительно заменить двоеточие и точку с запятой, а потом сделать map() реверс, но не одним символом, как посоветовали выше (всегда есть риск напороться на наличие такой подстроки/символа в данных), а каким-то своим набором типа <<TCHKZPT>> <<DVTCHK>> либо обозначениями переменных соответствующего значения [[TCHKZPT]] [[DVTCHK]] (что может оказаться еще интереснее)
-
((\".+\"){1,1}&|[^,]+)
это должно работать, проверять я это конечно не буду,
что странно вместо & желал поставить ? как признак не жадности, но все ошибки к лучшемуайч, и за чем я проверял
/(\".+\")|([^,]+),|([^,]+?)/gU
я думаю
или
/(\".+\")|([^,]+?)/gU
-
Спасибо всем за костыли) Буду пробовать. Но конечно, хотелось бы видеть в BAS работу с csv файлами с коробки, без лишних запар. Я не говорю уже про полноценный exel. Вот в Зенке, поставил свой разделитель в настройках, и при любых раскладах распарсит csv правильно.
-
@Gang
еще лучше конвертировать csv в dcv, а именно все поля обернуть в кавычки, проблема решенаесли cvs большой(реально большой) можно получить еще один том войны и мир.