Вверх ↑
Этот топик читают: Гость
Ответов: 45
Рейтинг: 2
#1: 2017-02-25 17:39:10 ЛС | профиль | цитата
Парни, а кто-нибудь решил проблему нормальной загрузки csv файла с двумя типами разделителей?

Пример файла:

Котик;Зайка;Коник;Мышка
Котик;Зайка;"Коник - скотина та еще парнокопытная, игривая, любопытная; при этом не лишенная мощности в 1 л.с";Мышка

Редактировалось 1 раз(а), последний 2017-02-25 17:40:04
карма: 1

0
Ответов: 1328
Рейтинг: 69
#2: 2017-02-25 18:10:30 ЛС | профиль | цитата
Strikerus, в чем проблема?
карма: 2

0
Ответов: 16884
Рейтинг: 1239
#3: 2017-02-25 18:22:11 ЛС | профиль | цитата
Konst писал(а):
Strikerus, в чем проблема?
наверное в том, что Коник - это отряд НЕПАРНОКОПЫТНЫХ
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
1
Голосовали:Strikerus
Ответов: 1328
Рейтинг: 69
#4: 2017-02-26 01:33:24 ЛС | профиль | цитата
Strikerus, используй табуляцию вместо ; и проблемы не будет
карма: 2

0
Ответов: 45
Рейтинг: 2
#5: 2017-02-26 06:51:32 ЛС | профиль | цитата
Использование таба или другого символа очевидное решение, однако CSV файл формируется в другом месте. К нам он уже приходит "как есть"

--- Добавлено в 2017-02-26 06:52:28

Tad писал(а):

наверное в том, что Коник - это отряд НЕПАРНОКОПЫТНЫХ

Вот народ, во всем кони у них виноваты )))

Редактировалось 1 раз(а), последний 2017-02-26 06:52:28
карма: 1

0
Ответов: 8950
Рейтинг: 824
#6: 2017-02-26 10:38:38 ЛС | профиль | цитата
Strikerus, наверное вы не заметили, что в вашем примере не "кавычки", но пара ''апостофов''
схема


Add(MainForm,2953706,196,112)
{
Width=428
link(onCreate,12651080:doWork2,[(256,132)(256,69)])
}
Add(Memo,9328239,329,56)
{
Left=10
Top=30
Width=270
Height=200
Strings=#23:Котик;Зайка;Коник;Мышка|116:Котик;Зайка;"Коник - скотина та еще парнокопытная, игривая, любопытная; при этом не лишенная мощности в 1 л.с";Мышка|
ScrollBars=3
}
Add(ListBox,12122945,672,119)
{
Left=285
Top=30
Width=120
Height=230
DataType=1
link(onClick,6128515:doText,[])
}
Add(Button,14132057,266,112)
{
Left=225
Top=235
Caption=">>"
link(onClick,14895959:doEvent1,[])
}
Add(ArrayEnum,9060520,343,119)
{
link(onItem,16705907:doReplace,[])
link(Array,9328239:Array,[])
}
Add(Hub,14895959,315,112)
{
link(onEvent1,12122945:doClear,[(666,118)(666,132)])
link(onEvent2,9060520:doEnum,[])
}
Add(Replace,16705907,392,119)
{
SubStr="""
DestStr=";"
link(onReplace,13468983:doReplace,[])
}
Add(FormatStr,16636807,483,119)
{
DataCount=1
Mask=";%1;"
link(onFString,9498494:doReplace,[])
}
Add(Replace,9498494,525,119)
{
SubStr=";;"
DestStr=";"
link(onReplace,3826484:doSearch,[])
}
Add(BlockFind,3826484,567,119)
{
IncludeBlock=1
Delete=0
ReplaceStr=";"
StartBlock=";"
EndBlock=";"
link(onSearch,14179467:doTrim,[])
}
Add(Replace,13468983,434,119)
{
SubStr="''"
DestStr=";"
link(onReplace,16636807:doString,[])
}
Add(Trim,14179467,616,119)
{
Char=" "
Mode=7
link(onTrim,12122945:doAdd,[])
}
Add(Edit,6128515,721,126)
{
Left=20
Top=5
Width=375
}
Add(Button,1397246,196,49)
{
Left=20
Top=235
Caption="New"
link(onClick,6497433:doEvent1,[])
}
Add(Hub,6497433,238,49)
{
link(onEvent1,9328239:doClear,[(311,55)(311,69)])
link(onEvent2,12651080:doWork1,[])
}
Add(MultiElement,12651080,266,56)
{
link(onEvent1,9328239:doAdd,[])
}
BEGIN_SDK
Add(EditMulti,6229223,21,21)
{
EventCount=1
WorkCount=2
Width=412
Height=137
link(doWork1,8604866:doFor,[(39,27)(39,41)])
link(doWork2,15771868:doRandSeed,[(32,34)(32,97)])
}
Add(For,8604866,49,35)
{
End=9
link(onEvent,3176202:doFor,[])
}
Add(For,3176202,105,35)
{
End=9
link(onEvent,8728549:doFor,[])
link(onStop,2882879:doEvent1,[(151,48)(151,132)])
}
Add(For,8728549,161,35)
{
End=9
link(onEvent,14358382:doRandom,[])
link(onStop,15771868:doRandom,[(207,48)(207,83)])
}
Add(Random,14358382,217,35)
{
Min=224
Max=255
link(onRandom,9397542:doConvert,[])
}
Add(StrCat,14624114,364,35)
{
Point(doClear)
link(Str1,7137491:Var3,[(370,26)(404,26)(404,77)])
}
Add(Convertor,9397542,301,35)
{
Mode=4
link(onResult,8552071:doWork2,[])
}
Add(DoData,15012832,301,77)
{
Data=String(;)
link(onEventData,8086382:doWork2,[])
}
Add(HubEx,8552071,343,35)
{
link(onEvent,14624114:doStrCat,[])
}
Add(Random,15771868,217,77)
{
Max=2
link(onRandom,6108650:doEvent,[])
}
Add(IndexToChanel,6108650,259,77)
{
Count=3
link(onEvent1,15012832:doData,[])
link(onEvent2,9446949:doData,[])
link(onEvent3,13210126:doData,[])
}
Add(DoData,9446949,301,84)
{
Data=String(")
link(onEventData,3364723:doWork2,[])
}
Add(DoData,13210126,301,91)
{
Data=String('')
link(onEventData,3364723:doWork3,[(347,97)])
}
Add(HubEx,8086382,343,77)
{
Angle=3
link(onEvent,8552071:doWork3,[])
}
Add(HubEx,3364723,343,84)
{
Angle=3
link(onEvent,8086382:doWork3,[])
}
Add(Hub,2882879,315,126)
{
link(onEvent1,15495871:doData,[(361,132)(361,97)])
link(onEvent2,14624114:doClear,[(354,139)(354,48)])
}
Add(DoData,15495871,371,91)
{
link(onEventData,6229223:onEvent1,[(410,97)(410,27)])
link(Data,7137491:Var2,[])
}
Add(GetDataEx,7137491,371,72)
{
Angle=3
link(Data,14624114:Result,[(370,77)])
}
END_SDK
Add(InfoTip,3824667,385,77)
{
Info=#13:Разбор строки|
Font=[MS Sans Serif,10,1,0,1]
Width=274
Height=81
}

карма: 19

1
Голосовали:Strikerus
Ответов: 45
Рейтинг: 2
#7: 2017-02-26 11:05:30 ЛС | профиль | цитата
Леонид, Благодарю за помощь, вот только не учтены эти самые кавычки-апострофы. Они означают, что текст между ними является содержимым одной ячейки, независимо от наличия ;
Т.е. выделенное должно быть одной строкой:

карма: 1

0
Ответов: 165
Рейтинг: 6
#8: 2017-02-26 11:52:58 ЛС | профиль | цитата
Strikerus, посмотрите в сторону регулярных выражений
карма: 4

0
Ответов: 8950
Рейтинг: 824
#9: 2017-02-26 14:06:06 ЛС | профиль | цитата
Strikerus, так надо в первом посте рассказывать условия, а не выдавать по капельке
добавка


Add(Replace,16705907,448,140)
{
SubStr="''"
DestStr="~"
link(onReplace,3767853:doReplace,[])
}
Add(FormatStr,16636807,728,147)
{
DataCount=1
Mask=";%1;"
link(onFString,7502433:doSearch,[])
}
Add(BlockFind,3826484,539,140)
{
Delete=0
StartBlock="~"
EndBlock="~"
Point(doReplaceStr)
link(onSearch,13468983:doReplace,[])
link(onEndSearch,14179467:doTrim,[])
}
Add(Replace,13468983,588,140)
{
SubStr=";"
link(onReplace,2801773:doReplace,[])
}
Add(Trim,14179467,679,147)
{
Char=" "
Mode=7
link(onTrim,16636807:doString,[])
}
Add(InfoTip,3824667,441,112)
{
Info=#13:Разбор строки|
Font=[MS Sans Serif,10,1,0,1]
Width=379
Height=81
}
Add(Replace,3767853,490,140)
{
SubStr="""
DestStr="~"
link(onReplace,3826484:doSearch,[])
}
Add(Replace,2801773,630,140)
{
SubStr="~"
link(onReplace,3826484:doReplaceStr,[(669,146)(669,132)(529,132)(529,153)])
}
Add(BlockFind,7502433,777,147)
{
IncludeBlock=1
Delete=0
ReplaceStr=";"
StartBlock=";"
EndBlock=";"
}

карма: 19

0
Ответов: 45
Рейтинг: 2
#10: 2017-02-26 14:11:58 ЛС | профиль | цитата
Леонид писал(а):
Strikerus, так надо в первом посте рассказывать условия, а не выдавать по капельке
добавка


Add(Replace,16705907,448,140)
{
SubStr="''"
DestStr="~"
link(onReplace,3767853:doReplace,[])
}
Add(FormatStr,16636807,728,147)
{
DataCount=1
Mask=";%1;"
link(onFString,7502433:doSearch,[])
}
Add(BlockFind,3826484,539,140)
{
Delete=0
StartBlock="~"
EndBlock="~"
Point(doReplaceStr)
link(onSearch,13468983:doReplace,[])
link(onEndSearch,14179467:doTrim,[])
}
Add(Replace,13468983,588,140)
{
SubStr=";"
link(onReplace,2801773:doReplace,[])
}
Add(Trim,14179467,679,147)
{
Char=" "
Mode=7
link(onTrim,16636807:doString,[])
}
Add(InfoTip,3824667,441,112)
{
Info=#13:Разбор строки
Font=[MS Sans Serif,10,1,0,1]
Width=379
Height=81
}
Add(Replace,3767853,490,140)
{
SubStr="""
DestStr="~"
link(onReplace,3826484:doSearch,[])
}
Add(Replace,2801773,630,140)
{
SubStr="~"
link(onReplace,3826484:doReplaceStr,[(669,146)(669,132)(529,132)(529,153)])
}
Add(BlockFind,7502433,777,147)
{
IncludeBlock=1
Delete=0
ReplaceStr=";"
StartBlock=";"
EndBlock=";"
}

Извиняюсь, конечно, но я рассчитывал на ответ тех, кто сталкивался с обработкой формата csv и знакОм с применением 2-х типов разделителей. PS: теперь ; в строке отвалилась:
Коник - скотина та еще парнокопытная, игривая, любопытная; при этом не лишенная мощности в 1 л.с
-------------------------------------
В любом случае благодарю за помощь

Редактировалось 6 раз(а), последний 2017-02-26 14:15:28
карма: 1

0
Ответов: 8950
Рейтинг: 824
#11: 2017-02-26 17:44:44 ЛС | профиль | цитата
Strikerus, эти точки с запятой внутри ''**;**'' специально выкинуты (замена на пробел), чтобы не мешали разбивать по ";". Да и выложенном фрагменте по-русски там должна быть запятая, но никак не точка с запятой
Измените замену на "#", или другой символ не встречающийся в тексте, а перед выходом строки сделайте обратную замену.

Редактировалось 1 раз(а), последний 2017-02-26 17:46:33
карма: 19

1
Голосовали:Strikerus
Ответов: 4663
Рейтинг: 767
#12: 2017-02-27 13:02:56 ЛС | профиль | цитата
Леонид писал(а):
специально выкинуты (замена на пробел), чтобы не мешали разбивать по ";"
Лучше сделать нормальный парсер CSV:
- указание разделителя (;)
- указание символа-обрамителя (")
- правильное определение открывающего и закрывающего обрамителя, между которыми разделитель не учитывается ("абв;где")
- если обрамитель встречается между обрамителями - он экранируется удваиванием ("абв""где").
- если разделитель найден вне обрамителей - значит, поле не обрамлено (123;"абв";456 частный случай: 123;а"б"в;456)
карма: 26

0
12
Сообщение
...
Прикрепленные файлы
(файлы не залиты)