Имя: Пароль:
1C
 
Разложить строку в массив. Но есть одно НО..
0 oslokot
 
04.06.16
12:34
Есть csv файл, задача тривиальна: прочитать и разложить строки в массив.

Файл с разделителями вида:
"Значение1";"Значение2";"Значение3";"Значение4" и т.д.

Пользуюсь типовой функцией РазложитьСтрокуВМассивПодстрок(Стр, ";")

Но блин, есть строки со значениями содержащие разделитель ";" например:
"Значение1";"Значение2;";"Значение3";"Значение4" и т.д.
Соответственно все сбивается.

Как красиво выкрутиться?

п.с. Экселька-то нормально открывает этот файл, все значения разделяет правильно.. как ей это удается - хз)
1 Lama12
 
04.06.16
12:39
Сделай вначале замену ;" на " во всем файле.
2 Tarzan_Pasha
 
04.06.16
12:41
(0)экранировать надо как то символы.
3 oslokot
 
04.06.16
12:47
(1) не исключено, что попадется вариант типа:
"Значение1";"Знач;ение2";"Значение3";"Значение4"
4 Garykom
 
гуру
04.06.16
12:47
(0) Экселька правильно парсит в отличие от СтрЗаменить(,";",)

Сделай посимвольный парсер в виде КА с состояниями, чтобы разделять числовые (без "") и строковые значения (внутри "") между разделителями.
И еще уточни есть ли экранирование кавычек внутри строковых и есть ли там вообще кавычки. От этого сложность парсера будет зависеть.

Если значений не обрамленных в кавычки нету и нет внутри сочетаний ";" кроме как разделители то дели по ним и все.
5 Garykom
 
гуру
04.06.16
12:48
(4)+ СтрЗаменить(ИсходнаяСтрока, """;""", ..)
6 oslokot
 
04.06.16
12:50
Что характерно, все значения находятся между ковычками
А вот встречаются ли ковычки среди ковычек.. хз.. надо понаблюдать
7 Serginio1
 
04.06.16
12:53
8 Матиус III
 
04.06.16
12:53
(0) Ваши предки в вашем возрасте уже ракеты создали и человека в космос отправили, а в с такой ерундой справиться не можете...
9 Serginio1
 
04.06.16
12:55
(8) Там не совсем ерунда, но обыкновенный ДКА
10 oslokot
 
04.06.16
12:59
(7) спасибо, интересно. сейчас попробую
11 Матиус III
 
04.06.16
13:00
(9) Все равно, подобная задача должна решаться автоматически, не вызывая замедления в решении основной задачи.
12 oslokot
 
04.06.16
13:00
(5) да, хороший вариант
13 Матиус III
 
04.06.16
13:03
(12) Плохой вариант. Споткнется на одном из этого:
"1" ;"2"
"3"; "4"
Пробелов гарантированно не будет?
14 Serginio1
 
04.06.16
13:06
7+ строка для разбора
То есть Например такая строка
435,"7689900--"",,,369"
где Delimiter="," и QuoteChar=""""

Содержит значения
435
7689900--",,,369
15 oslokot
 
04.06.16
13:29
(14) Спасибо! Вот так работает:
ИзСтрокиСРазделителями(СтрокаДанных, ";", """")
16 oslokot
 
04.06.16
13:31
Но если попадется ковычка среди ковычек то всё.
Правда, пока таких случаев не наблюдал
17 Serginio1
 
04.06.16
13:34
(16) Смотри 14 там есть все варианты. Разбирает всё согласно правилам.
18 oslokot
 
04.06.16
13:36
Хотя можно пока и так оставить:
СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтрокаДанных, """;""")

(17) спасибо буду экспериментировать..
19 breezee
 
04.06.16
18:49
Самый простой способ - писать строку, используя за место разделителя ";" Какой-нибудь символ из юникода. На пример треугольник.
20 shulerr
 
04.06.16
19:41
СтрЗаменить(стр, """;", Символы.ПС);
21 Serginio1
 
04.06.16
20:46
(20) смотри 14