Работа с текстовым файлов как с строкой
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- Игорь Столяров
- Ветеран движения
- Сообщения: 7432
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Вопрос из регионов !
Заранее извиняюсь за дерзость, но не ту ли кого примера работы с текстовым файлом, загруженным в строку ?
Т.е. загрузили TXT (CSV) файл в строку (а ещё лучше IDynStr) и можем перебрать записи (и например распечатать).
А то у меня два события одновременно:
1. Задрало огромное кол-во объявлений ASCII файлов
2. Мозг категорически отказывается думать.
Заранее извиняюсь за дерзость, но не ту ли кого примера работы с текстовым файлом, загруженным в строку ?
Т.е. загрузили TXT (CSV) файл в строку (а ещё лучше IDynStr) и можем перебрать записи (и например распечатать).
А то у меня два события одновременно:
1. Задрало огромное кол-во объявлений ASCII файлов
2. Мозг категорически отказывается думать.
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7432
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Та много его. Объяви, имя присвой, открой, читай, закрой … Первые 20 раз прикольно, потом надоедает.
А так хорошо - загрузил в строку, прочитал последовательно. Забыл. И строку удобно передавать по адресу.
За теми кто отстал - не возвращаться. (С) Кодекс
- Дед Пахом
- Старичок
- Сообщения: 3142
- Зарегистрирован: 07 Июль 2005, 16:51
- Откуда: Москва, Россия
- Благодарил (а): 11 раз
- Поблагодарили: 32 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
А объявить один на все случаи жизни? Все CSV же одинаковые (строка<cr,lf>строка<cr,lf>...<eof>)
С уважением, ДП
Работа с текстовым файлов как с строкой
Пользую для этой цели свой же класс CSTR, методы LoadFromFile и SaveToFile
Код: Выделить всё
Text Cstr
....
Err# = Text.LoadFromFile( MyTextFileName)
IF Err# =0
! Text.S содержит строку, Text.Len её длину
ELSE
! Err# содержит ErrorCode()
END
...
Text.SaveToFile ( MyTextFileName) ! Записали обратно
- Игорь Столяров
- Ветеран движения
- Сообщения: 7432
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Загрузить строку из файла и сохранить строку в файл - дело нехитрое и известное ...Yufil писал(а): ↑15 Сентябрь 2018, 7:56LoadFromFile и SaveToFile
Вопрос в том, как пройтись по ней, получая отдельные строки текстового файла …
За теми кто отстал - не возвращаться. (С) Кодекс
Работа с текстовым файлов как с строкой
У меня как-то так...
Есть файл конфигурации, формат почти csv
Есть файл конфигурации, формат почти csv
Код: Выделить всё
Loc:P CSTR
CS CSTR
....
! Cчитываем файл конфигурации
CS.LoadFromFile(ConfigFileName)
! Добавим на всякий случай хвостик
CS.Cat('<13,10>')
Loc:Start = 1
LOOP
CRLF# = INSTRING('<13,10>',CS.S,1,Loc:Start)
! Ищем конец строки
IF CRLF# = 0
Break
END
! Если вылезли за пределы строки ( специфика... )
IF Loc:Start > (CS.Len - 5) OR Loc:Start=0
Break
END
! Получаем подстроку
Loc:P.Set(CS.S[Loc:Start : CRLF#-1])
Loc:Start = CRLF#+2
! Разбираем подстроку процедурой ParseParmList, укладываем параметры в очередь
! ParQ - очередь "идентификатор-значение"
ParseParmList(Loc:P.S, ParQ, ParQ:ID, ParQ:Value, ', ')
END
- Игорь Столяров
- Ветеран движения
- Сообщения: 7432
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Спасибо ! Что-то вроде этого я и задумал. Тут главное, разобраться со всем "хвостиками", пустыми строками и т.д.
Буду пробовать.
За теми кто отстал - не возвращаться. (С) Кодекс
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1378
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 7 раз
- Поблагодарили: 1 раз
- Контактная информация:
Работа с текстовым файлов как с строкой
А зачем объявлять много файлов, а не один? Или работать надо сразу со всеми одновременно?
- Игорь Столяров
- Ветеран движения
- Сообщения: 7432
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
А что бы файл заканчивался переводом строки и по нему отсекать строку без анализа EOF() …vic7tar писал(а): ↑15 Сентябрь 2018, 14:37А почему именно такой хвостик?
И так тоже бывает, но дело не в том … На мой субъективный взгляд, ASCII драйвер это уже анахронизм, рудимент из времениRaFaeL писал(а): ↑15 Сентябрь 2018, 14:03Или работать надо сразу со всеми одновременно?
когда нельзя было работать с текстовым массивом данных в памяти по причине дефицита оной.
Значительно проще (и быстрей) просто получить текстовый файл в память и далее с ним работать, чем юзать по строкам.
Про запись я вообще молчу. Много лет назад поднимал здесь вопрос что записать 50 MB через драйвер ASCII - это просто жесть.
У нас уже давно любой экспорт данных в XML или JSON делается только через DOS драйвер - так хоть приемлемая скорость ...
За теми кто отстал - не возвращаться. (С) Кодекс
Работа с текстовым файлов как с строкой
Вроде всё не так суцидально. У меня одна программа генерит лог в текстовый файл, а другая этот лог разбирает на строки, загружает в очередь и показывает в листбоксе . Длина лога сейчас может доходить до нескольких мегабайт. Первоначально он грузился несколько минут, сейчас 2-3 секунды.
Сначала даже на winAPI написал чтение, потом оказалось, что это не сильно нужно, и так вполне шустро.
Кстати, после этого надо было пачечку файлов ( от 20 М до 2-3 Г ) в zip запаковать. И тоже выяснилось, что архиватор 7z запакует в разы быстрее, чем старый добрый zlib.
Код: Выделить всё
AsciiFile File,Driver('ASCII','/QUICKSCAN=ON,/FILEBUFFERS=200'),Name(Loc:SFileName),Pre(AF)
Record RECORD
S String(400)
END
END
...
OPEN(AsciiFile, ReadOnly)
...
CLOSE( AsciiFile)
Кстати, после этого надо было пачечку файлов ( от 20 М до 2-3 Г ) в zip запаковать. И тоже выяснилось, что архиватор 7z запакует в разы быстрее, чем старый добрый zlib.
Работа с текстовым файлов как с строкой
К чему я клоню.Игорь Столяров писал(а): ↑15 Сентябрь 2018, 20:11А что бы файл заканчивался переводом строки и по нему отсекать строку без анализа EOF() …
Все продукты от MS, связанные с текстом, по исторической традиции угодить никсам и макам пишут в конец строки <0D , 0A>.
Я, например, на постоянной основе использую Ceany, в том числе и для текстовых документов.
Так вот, он в качестве конца строки пишет только <0A>. После открытия и записи после какого-нибудь WordPad-а вместо <0A> появятся, конечно же, <0D , 0A>.
Возьмем, например, сишный вывод в файл -> fprintf( file, " %s\n", "Hello World" ).
После сборки в VS в файл в качестве конца строки пишется <0D , 0A>, после gcc или g++ записывает в соответствии с \n положенный <0A>.
C10, Win10x64
- Игорь Столяров
- Ветеран движения
- Сообщения: 7432
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 16 раз
- Поблагодарили: 51 раз
Работа с текстовым файлов как с строкой
Корни этой проблемы уходят в те времена, когда человеки печатали на печатных машинках …vic7tar писал(а): ↑15 Сентябрь 2018, 22:30Так вот, он в качестве конца строки пишет только <0A>
Раскладка клавиатуры и коды в текстовом файла просто повторяли клавиши машинки.
<09> - табуляция, <0D> - конец строки, <0A> - перевод каретки (новая строка).
Надо ли явно завершать строку перед тем как начать новую (перевести каретку) ?
Цивилизованный мир верен традициям предков и считает, что да, надо.
Но есть бунтовщики, которые считают, что начало новой строки автоматом завершает предыдущую,
т.к. иначе возникает неопределённость: "первая строка<13>кто я есть ?<10>вторая строка".
За теми кто отстал - не возвращаться. (С) Кодекс
Работа с текстовым файлов как с строкой
<-> наоборот.Игорь Столяров писал(а): ↑16 Сентябрь 2018, 6:51, <0D> - конец строки, <0A> - перевод каретки (новая строка).
А цивилизованный мир - это мир MS?Игорь Столяров писал(а): ↑16 Сентябрь 2018, 6:51Надо ли явно завершать строку перед тем как начать новую (перевести каретку) ?
Цивилизованный мир верен традициям предков и считает, что да, надо.
Моя предыдущая писанина не о том как надо завершать строки, а о том, что может встретится случай, когда instring('<13,10>',str,start_str) не сработает, примеры привел выше.
Можно для обработки получить со стороны текстовый файл где вместо этого ожидаемого хвостика будет стоять то, что не ожидали. Этот случай может быть один на тысячу, но он может быть.
C10, Win10x64