Вход | Регистрация
 

работа с текстовым файлом

работа с текстовым файлом
Я
   lamme
 
07.07.21 - 10:27
Есть csv файл со структурой  (разделитель - ЗПТ)

Число1,"Строка1",Число2,"Строка5"
Число4,"Строка6,Строка7,Строка8",Число20,"Строка100"

как правильно можно разобрать по параметрам?
(прошу обратить внимание на стр2 - где в одном параметре есть зпт)

РазложитьВМассивПодстрок - тут хорошо работает только на стр1 - где в строковых параметрах нет зпт
а на второй строке - облом.
   Fragster
 
1 - 07.07.21 - 10:29
adodb или внешний источник данных
   Bigbro
 
2 - 07.07.21 - 10:29
замените запятые в исходном тесте на "нечто невстречаемое" после разбиения обратная замена.
   lamme
 
3 - 07.07.21 - 10:43
1 - пример?
2 - исходный текст не меняется.
   VladZ
 
4 - 07.07.21 - 10:47
(0) Где взяли исходный текст?
Пообщаться с теми, кто предоставил эту "дичь" и попросить в нормальном виде.
   Смотрящий
 
5 - 07.07.21 - 10:53
(0) Тебе надо заменить запятую разделяющую поля на какой нить символ, например тильду, не трогая запятые в красках.
Посимвольное сканирование с выставлением флага либо поиск диапазонов.
Проще получить измененный исходный файл
   SleepyHead
 
6 - 07.07.21 - 10:59
(0) Совсем обленились.. простенький конечный автомат сделай.
   Ногаминебить
 
7 - 07.07.21 - 11:10
Если типы число/строка всегда идут в одинаковом сочетании - то несложно. Иначе теоретически возможны варианты всякие нехорошие.
ЗЫ:
В числе разделитель дробной части не запятая случайно?
   Bigbro
 
8 - 07.07.21 - 11:13
вторую строку ты не поделишь никогда нормально. нет критерия чтобы считать какая из встреченных запятых относится к разделителю а какая к тексту если их суммарно больше 3х.
   ДенисЧ
 
9 - 07.07.21 - 11:15
(8) С какого перепоя нет? Есть. Кавычки посчитать же можно
   Bigbro
 
10 - 07.07.21 - 11:17
а при чем тут кавычки
   ДенисЧ
 
11 - 07.07.21 - 11:17
(10) Ты прав. Совершенно ни причём. Ну просто абсолютно.
   Bigbro
 
12 - 07.07.21 - 11:17
в csv никаких кавычек не будет, они тут для красоты чтобы "строка" выделялась
   acht
 
13 - 07.07.21 - 11:17
(10) Программисты 1С такие программисты
   Василий Алибабаевич
 
14 - 07.07.21 - 11:18
(10) Строка начинается с кавычки и заканчивается кавычкой ЖЕ. Все что между кавычками 1 и 2 - строка, 3 и 4 - строка ...
   Bigbro
 
15 - 07.07.21 - 11:18
покажите пример этого csv, а то я тут смотрю гении набежали.
   acht
 
16 - 07.07.21 - 11:20
(15) Я тебе лучше https://www.rfc-editor.org/rfc/rfc4180.txt пункт 2, часть 5 покажу
   Василий Алибабаевич
 
17 - 07.07.21 - 11:21
(15) Стандарт RFC 4180 :
...
"если поле содержит запятые, переносы строк, двойные кавычки, то это поле должно быть заключено в двойные кавычки."
"символ двойной кавычки в поле должен быть удвоен."
   DimVad
 
18 - 07.07.21 - 11:27
1. Считываете строку в переменную СтрокаИзФайла
2. Устанавливаете булевскую переменную ЕстьКавычка в Ложь
3. Делаете цикл по всем символам строки в котором"
   а. Встретив кавычку меняете значение переменной ЕстьКавычка.
   б. Встретив символ , меняете его на какой-нибудь не встречаемый в тексте если переменная ЕстьКавычка = Ложь.
4. Раскладываете в массив по тому символу, на которой меняли ,
   Ногаминебить
 
19 - 07.07.21 - 11:29
(18) А если там подряд два параметра с типом число?
   DimVad
 
20 - 07.07.21 - 11:30
(19) Как это выглядит ?
   Bigbro
 
21 - 07.07.21 - 11:30
ага. и я должен Верить! что у меня входной файл будет соответствовать формату?
ну-ну.
   Bigbro
 
22 - 07.07.21 - 11:31
сохранил Экселем csv никаких кавычек нет. как и предполагалось.
   acht
 
23 - 07.07.21 - 11:33
(21) Программисты 1С такие программисты
   Smallrat
 
24 - 07.07.21 - 11:34
(0) если строка параметров не переносится на другую строку, то непонятно в чем проблема: читаем построчно, выделяем число, найдя первую запятую, после нее находим кавычки с помощью СтрНайти(), находим закрывающие кавычки также - все что между ними разделяем с помощью СтрРазделить(), идем дальше по строке, ища следующую запятую, выделяем число и т.д. по окончанию строки переходим к следующей.
   Bigbro
 
25 - 07.07.21 - 11:35
(23) я достаточно повидал csv на своем веку. и в 1с и в САП работая.
чтобы тупые ссылки на RFC отметать как бред.
не будет у вас никогда реальный файл соответствовать какому то стандарту. не будет.
   Ногаминебить
 
26 - 07.07.21 - 11:35
(20) Да, не вчитался в текст, так отработает если внутри строки кавычек нет конечно. На что я бы не закладывался.
Ну и если (12) прав - тогда вообще финиш.
   Bigbro
 
27 - 07.07.21 - 11:36
(24) он же написал - в том тексте, что между ними могут быть еще запятые. увы.
   Smallrat
 
28 - 07.07.21 - 11:40
(27) мне кажется (0) не это имел в виду, а то что у него в параметрах идет перечисление строк через запятую. Если у него в строках встречаются запятые - то тут просто работает правило - если ты можешь разобрать этот текст вручную на бумажке, значит можно написать алгоритм, если нет, то нет.
   Bigbro
 
29 - 07.07.21 - 11:42
поэтому я и попросил пример файла или строки из него.
а то гении заклевали.
   Вафель
 
30 - 07.07.21 - 11:42
где-то тут недавно преобразователь в дбф таких файлов кидали
 
 
   acht
 
31 - 07.07.21 - 11:42
(25) > тупые ссылки на RFC отметать как бред.
Программисты 1С такие программисты
   ДенисЧ
 
32 - 07.07.21 - 11:44
(29) А что, в (0) нет примера?
"Программисты 1С такие программисты" (с)

ЗЫ. Теперь я начинаю понимать, почему бухгалтерия не любит многих из нас... ((
   Вафель
 
33 - 07.07.21 - 11:47
   Fragster
 
34 - 07.07.21 - 14:42
да уж,и ведь тут профессионалы собрались. в (33), кстати, есть ado и он единственный (вроде), не глючит из того, что там есть на сложных примерах. ну, может еще а простыни кода тоже работают норм, но явно не так быстро, как ADO или внешний источник.
   ДенисЧ
 
35 - 07.07.21 - 14:52
(34) Адо уже deprecated, нужно использовать микросервисы на голанге.
   T1C
 
36 - 07.07.21 - 18:34
(5) Я всегда тильду в качестве разделителя использую )


Список тем форума
 
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.