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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3517
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 14 Сентябрь 2018, 20:30

Вопрос из регионов ! :)

Заранее извиняюсь за дерзость, но не ту ли кого примера работы с текстовым файлом, загруженным в строку ?
Т.е. загрузили TXT (CSV) файл в строку (а ещё лучше IDynStr) и можем перебрать записи (и например распечатать).

А то у меня два события одновременно:
1. Задрало огромное кол-во объявлений ASCII файлов
2. Мозг категорически отказывается думать. :)
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2039
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

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

Сообщение Дед Пахом » 14 Сентябрь 2018, 20:40

Почему не ASCII-драйвер?
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3517
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 14 Сентябрь 2018, 20:56

Дед Пахом писал(а):
14 Сентябрь 2018, 20:40
Почему не ASCII-драйвер?
Та много его. Объяви, имя присвой, открой, читай, закрой … :( Первые 20 раз прикольно, потом надоедает.
А так хорошо - загрузил в строку, прочитал последовательно. Забыл. :) И строку удобно передавать по адресу.
«V» значит Вендетта !

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2039
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

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

Сообщение Дед Пахом » 14 Сентябрь 2018, 21:00

А объявить один на все случаи жизни? Все CSV же одинаковые (строка<cr,lf>строка<cr,lf>...<eof>)
С уважением, ДП

Yufil
Ветеран движения
Сообщения: 1008
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 15 Сентябрь 2018, 7:56

Пользую для этой цели свой же класс CSTR, методы LoadFromFile и SaveToFile

Код: Выделить всё

Text  Cstr
.... 

Err# =  Text.LoadFromFile( MyTextFileName)
IF Err# =0 
    !  Text.S содержит строку, Text.Len её длину 
ELSE 
    !  Err# содержит ErrorCode() 
END 

... 
Text.SaveToFile ( MyTextFileName)  ! Записали обратно 


Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3517
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 15 Сентябрь 2018, 8:38

Yufil писал(а):
15 Сентябрь 2018, 7:56
LoadFromFile и SaveToFile
Загрузить строку из файла и сохранить строку в файл - дело нехитрое и известное ...
Вопрос в том, как пройтись по ней, получая отдельные строки текстового файла … ;)
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1008
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 15 Сентябрь 2018, 9:05

У меня как-то так...
Есть файл конфигурации, формат почти 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 


Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3517
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 15 Сентябрь 2018, 9:48

Yufil писал(а):
15 Сентябрь 2018, 9:05
Есть файл конфигурации, формат почти csv
Спасибо ! Что-то вроде этого я и задумал. :) Тут главное, разобраться со всем "хвостиками", пустыми строками и т.д.
Буду пробовать. :)
«V» значит Вендетта !

Аватара пользователя
RaFaeL
Ветеран
Сообщения: 711
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Контактная информация:

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

Сообщение RaFaeL » 15 Сентябрь 2018, 14:03

А зачем объявлять много файлов, а не один? Или работать надо сразу со всеми одновременно?

Аватара пользователя
vic7tar
Активист
Сообщения: 103
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar » 15 Сентябрь 2018, 14:37

Yufil писал(а):
15 Сентябрь 2018, 9:05
! Добавим на всякий случай хвостик CS.Cat('<13,10>')
А почему именно такой хвостик?
C10, Win10x64

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3517
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 15 Сентябрь 2018, 20:11

vic7tar писал(а):
15 Сентябрь 2018, 14:37
А почему именно такой хвостик?
А что бы файл заканчивался переводом строки и по нему отсекать строку без анализа EOF() …
RaFaeL писал(а):
15 Сентябрь 2018, 14:03
Или работать надо сразу со всеми одновременно?
И так тоже бывает, но дело не в том … На мой субъективный взгляд, ASCII драйвер это уже анахронизм, рудимент из времени
когда нельзя было работать с текстовым массивом данных в памяти по причине дефицита оной.

Значительно проще (и быстрей) просто получить текстовый файл в память и далее с ним работать, чем юзать по строкам.
Про запись я вообще молчу. Много лет назад поднимал здесь вопрос что записать 50 MB через драйвер ASCII - это просто жесть.
У нас уже давно любой экспорт данных в XML или JSON делается только через DOS драйвер - так хоть приемлемая скорость ...
«V» значит Вендетта !

Yufil
Ветеран движения
Сообщения: 1008
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

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

Сообщение Yufil » 15 Сентябрь 2018, 22:15

Вроде всё не так суцидально. У меня одна программа генерит лог в текстовый файл, а другая этот лог разбирает на строки, загружает в очередь и показывает в листбоксе . Длина лога сейчас может доходить до нескольких мегабайт. Первоначально он грузился несколько минут, сейчас 2-3 секунды.

Код: Выделить всё

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) 
Сначала даже на winAPI написал чтение, потом оказалось, что это не сильно нужно, и так вполне шустро.

Кстати, после этого надо было пачечку файлов ( от 20 М до 2-3 Г ) в zip запаковать. И тоже выяснилось, что архиватор 7z запакует в разы быстрее, чем старый добрый zlib.

Аватара пользователя
vic7tar
Активист
Сообщения: 103
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar » 15 Сентябрь 2018, 22:30

Игорь Столяров писал(а):
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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3517
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

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

Сообщение Игорь Столяров » 16 Сентябрь 2018, 6:51

vic7tar писал(а):
15 Сентябрь 2018, 22:30
Так вот, он в качестве конца строки пишет только <0A>
Корни этой проблемы уходят в те времена, когда человеки печатали на печатных машинках …
Раскладка клавиатуры и коды в текстовом файла просто повторяли клавиши машинки.
<09> - табуляция, <0D> - конец строки, <0A> - перевод каретки (новая строка).

Надо ли явно завершать строку перед тем как начать новую (перевести каретку) ?
Цивилизованный мир верен традициям предков и считает, что да, надо.
Но есть бунтовщики, которые считают, что начало новой строки автоматом завершает предыдущую,
т.к. иначе возникает неопределённость: "первая строка<13>кто я есть ?<10>вторая строка". :)
«V» значит Вендетта !

Аватара пользователя
vic7tar
Активист
Сообщения: 103
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar » 16 Сентябрь 2018, 20:10

Игорь Столяров писал(а):
16 Сентябрь 2018, 6:51
, <0D> - конец строки, <0A> - перевод каретки (новая строка).
<-> наоборот.
Игорь Столяров писал(а):
16 Сентябрь 2018, 6:51
Надо ли явно завершать строку перед тем как начать новую (перевести каретку) ?
Цивилизованный мир верен традициям предков и считает, что да, надо.
А цивилизованный мир - это мир MS?
Моя предыдущая писанина не о том как надо завершать строки, а о том, что может встретится случай, когда instring('<13,10>',str,start_str) не сработает, примеры привел выше.
Можно для обработки получить со стороны текстовый файл где вместо этого ожидаемого хвостика будет стоять то, что не ожидали. Этот случай может быть один на тысячу, но он может быть.
C10, Win10x64

Ответить