Страница 1 из 3

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

Добавлено: 14 Сентябрь 2018, 20:30
Игорь Столяров
Вопрос из регионов ! :)

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

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

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

Добавлено: 14 Сентябрь 2018, 20:40
Дед Пахом
Почему не ASCII-драйвер?

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

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

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

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

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

Добавлено: 15 Сентябрь 2018, 7:56
Yufil
Пользую для этой цели свой же класс CSTR, методы LoadFromFile и SaveToFile

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

Text  Cstr
.... 

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

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


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

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

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

Добавлено: 15 Сентябрь 2018, 9:05
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 


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

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

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

Добавлено: 15 Сентябрь 2018, 14:03
RaFaeL
А зачем объявлять много файлов, а не один? Или работать надо сразу со всеми одновременно?

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

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

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

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

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

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

Добавлено: 15 Сентябрь 2018, 22:15
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.

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

Добавлено: 15 Сентябрь 2018, 22:30
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>.

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

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

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

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

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