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

Clarion, Clarion 7

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

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

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

Сообщение Игорь Столяров »

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

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

А то у меня два события одновременно:
1. Задрало огромное кол-во объявлений ASCII файлов
2. Мозг категорически отказывается думать. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

Почему не ASCII-драйвер?
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Дед Пахом писал(а): 14 Сентябрь 2018, 20:40Почему не ASCII-драйвер?
Та много его. Объяви, имя присвой, открой, читай, закрой … :( Первые 20 раз прикольно, потом надоедает.
А так хорошо - загрузил в строку, прочитал последовательно. Забыл. :) И строку удобно передавать по адресу.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

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

Сообщение Дед Пахом »

А объявить один на все случаи жизни? Все CSV же одинаковые (строка<cr,lf>строка<cr,lf>...<eof>)
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

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

Text  Cstr
.... 

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

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Yufil писал(а): 15 Сентябрь 2018, 7:56LoadFromFile и SaveToFile
Загрузить строку из файла и сохранить строку в файл - дело нехитрое и известное ...
Вопрос в том, как пройтись по ней, получая отдельные строки текстового файла … ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

Yufil писал(а): 15 Сентябрь 2018, 9:05Есть файл конфигурации, формат почти csv
Спасибо ! Что-то вроде этого я и задумал. :) Тут главное, разобраться со всем "хвостиками", пустыми строками и т.д.
Буду пробовать. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1376
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

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

Сообщение RaFaeL »

А зачем объявлять много файлов, а не один? Или работать надо сразу со всеми одновременно?
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

Yufil писал(а): 15 Сентябрь 2018, 9:05! Добавим на всякий случай хвостик CS.Cat('<13,10>')
А почему именно такой хвостик?
C10, Win10x64
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

Значительно проще (и быстрей) просто получить текстовый файл в память и далее с ним работать, чем юзать по строкам.
Про запись я вообще молчу. Много лет назад поднимал здесь вопрос что записать 50 MB через драйвер ASCII - это просто жесть.
У нас уже давно любой экспорт данных в XML или JSON делается только через DOS драйвер - так хоть приемлемая скорость ...
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

Вроде всё не так суцидально. У меня одна программа генерит лог в текстовый файл, а другая этот лог разбирает на строки, загружает в очередь и показывает в листбоксе . Длина лога сейчас может доходить до нескольких мегабайт. Первоначально он грузился несколько минут, сейчас 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
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

Игорь Столяров писал(а): 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
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7329
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

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

Сообщение Игорь Столяров »

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

Надо ли явно завершать строку перед тем как начать новую (перевести каретку) ?
Цивилизованный мир верен традициям предков и считает, что да, надо.
Но есть бунтовщики, которые считают, что начало новой строки автоматом завершает предыдущую,
т.к. иначе возникает неопределённость: "первая строка<13>кто я есть ?<10>вторая строка". :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

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

Сообщение vic7tar »

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