Парни, а кто-нибудь решил проблему нормальной загрузки csv файла с двумя типами разделителей?
Пример файла:
Котик;Зайка;Коник;Мышка
Котик;Зайка;"Коник - скотина та еще парнокопытная, игривая, любопытная; при этом не лишенная мощности в 1 л.с";Мышка
Редактировалось 1 раз(а), последний 2017-02-25 17:40:04
Этот топик читают: Гость
Ответов: 45
Рейтинг: 2
|
|||
карма: 1 |
|
Ответов: 1328
Рейтинг: 69
|
|||
Strikerus, в чем проблема?
|
|||
карма: 2 |
|
Ответов: 16884
Рейтинг: 1239
|
|||
Konst писал(а): Strikerus, в чем проблема? |
|||
карма: 25 |
| ||
Голосовали: | Strikerus |
Ответов: 1328
Рейтинг: 69
|
|||
Strikerus, используй табуляцию вместо ; и проблемы не будет
|
|||
карма: 2 |
|
Ответов: 45
Рейтинг: 2
|
|||
Использование таба или другого символа очевидное решение, однако CSV файл формируется в другом месте. К нам он уже приходит "как есть"
--- Добавлено в 2017-02-26 06:52:28 Tad писал(а):
наверное в том, что Коник - это отряд НЕПАРНОКОПЫТНЫХ Вот народ, во всем кони у них виноваты ))) Редактировалось 1 раз(а), последний 2017-02-26 06:52:28 |
|||
карма: 1 |
|
Ответов: 8950
Рейтинг: 824
|
|||
Strikerus, наверное вы не заметили, что в вашем примере не "кавычки", но пара ''апостофов''
![]()
|
|||
карма: 19 |
| ||
Голосовали: | Strikerus |
Ответов: 45
Рейтинг: 2
|
|||
Леонид, Благодарю за помощь, вот только не учтены эти самые кавычки-апострофы. Они означают, что текст между ними является содержимым одной ячейки, независимо от наличия ;
Т.е. выделенное должно быть одной строкой: ![]() |
|||
карма: 1 |
|
Ответов: 165
Рейтинг: 6
|
|||
Strikerus, посмотрите в сторону регулярных выражений
|
|||
карма: 4 |
|
Ответов: 8950
Рейтинг: 824
|
|||
Strikerus, так надо в первом посте рассказывать условия, а не выдавать по капельке
![]() ![]()
|
|||
карма: 19 |
|
Ответов: 45
Рейтинг: 2
|
|||
Леонид писал(а): 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 |
|
Ответов: 8950
Рейтинг: 824
|
|||
Strikerus, эти точки с запятой внутри ''**;**'' специально выкинуты (замена на пробел), чтобы не мешали разбивать по ";". Да и выложенном фрагменте по-русски там должна быть запятая, но никак не точка с запятой
![]() Измените замену на "#", или другой символ не встречающийся в тексте, а перед выходом строки сделайте обратную замену. Редактировалось 1 раз(а), последний 2017-02-26 17:46:33 |
|||
карма: 19 |
| ||
Голосовали: | Strikerus |
Ответов: 4663
Рейтинг: 767
|
|||
Леонид писал(а): специально выкинуты (замена на пробел), чтобы не мешали разбивать по ";"- указание разделителя (;) - указание символа-обрамителя (") - правильное определение открывающего и закрывающего обрамителя, между которыми разделитель не учитывается ("абв;где") - если обрамитель встречается между обрамителями - он экранируется удваиванием ("абв""где"). - если разделитель найден вне обрамителей - значит, поле не обрамлено (123;"абв";456 частный случай: 123;а"б"в;456) |
|||
карма: 26 |
|
12