Работа с текстовым файлов как с строкой
Модератор: Дед Пахом
					Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
	При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- RaFaeL
- ✯ Ветеран ✯
- Сообщения: 1417
- Зарегистрирован: 24 Март 2009, 17:59
- Откуда: НН
- Благодарил (а): 12 раз
- Поблагодарили: 2 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
У меня была задачка по работе с текстовым файлом, и там файлы как раз могли встречаться с разными вариантами конца строки, делал примерно так - грузим сначала файл в строку, делаем поиск <13,10>, если что-то нашли значит это "виндовый" формат, шлем в драйвер "EOF=2,13,10", переоткрываем, читаем по записям. Не нашли - шлем "1,10". Исходники утеряны, пример кода не смогу привести
			
			
									
						- Игорь Столяров
- Ветеран движения
- Сообщения: 8269
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
Работа с текстовым файлов как с строкой
Ну тут всё сводится к простому определению "типа" текстового файла для параметров драйвера.
Т.е. Choose(InString('<13,10>' ... А хотелось бы ASCII драйвер не юзать. Совсем.
Наверно да. Где-то в чертогах разума сидит ещё, что в DOS у клавиши ENTER был код 13.

Я вот подозревал, что всё непросто - потому и спросил ...
Если отбросить совсем футуристические варианты, то видимо действительно нужно искать перенос строки как <10>,
но но при этом убирать из строки возможный последний символ <13> и контролировать хвостик строки (конец файла).

За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5567
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 78 раз
Работа с текстовым файлов как с строкой
Код: Выделить всё
LoadFile PROCEDURE (pName)
loc:szFile          CSTRING(FILE:MaxFileName)
loc:hFile           LONG
loc:dwSize          UNSIGNED
loc:lpFileSizeHigh  ULONG
loc:dwBytesRead     ULONG
loc:bRead           BOOL
loc:StrBuf          &CString
loc:ok  byte
   CODE
      loc:szFile=pName
      loc:hFile = CreateFile(loc:szFile,GENERIC_READ,0,0,OPEN_EXISTING,0,0)
      if loc:hFile <> INVALID_HANDLE_VALUE
         loc:dwSize = GetFileSize(loc:hFile,loc:lpFileSizeHigh)
         if loc:dwSize > 0
            loc:StrBuf &= new(CSTRING(loc:dwSize))
            loc:bRead = ReadFile(loc:hFile,ADDRESS(loc:StrBuf),SIZE(loc:StrBuf),loc:dwBytesRead,0)
            loc:ok=1
         end
         CloseHandle(loc:hFile)
      end
C6/C12, ШВС, tps/btrieve.
			
						- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 5567
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 18 раз
- Поблагодарили: 78 раз
Работа с текстовым файлов как с строкой
Прототипы.
			
			
									
						Код: Выделить всё
     MODULE('WINAPI')      
    CreateFile(*CSTRING,ULONG,ULONG,LONG,ULONG,ULONG,UNSIGNED=0),UNSIGNED,RAW,PASCAL,NAME('CreateFileA')
       GetFileSize(UNSIGNED,*ULONG),ULONG,PASCAL,NAME('GetFileSize')
       ReadFile(UNSIGNED,LONG,ULONG,*ULONG,LONG),BOOL,PASCAL,RAW,NAME('ReadFile')
       WriteFile(UNSIGNED,<*?>,ULONG,*ULONG,<*?>),BOOL,PASCAL,RAW,PROC
       CloseHandle(UNSIGNED),BOOL,PASCAL,PROC,NAME('CloseHandle')
     END
C6/C12, ШВС, tps/btrieve.
			
						- Игорь Столяров
- Ветеран движения
- Сообщения: 8269
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
Работа с текстовым файлов как с строкой
Спасибо всем, кто принял участие в обсуждении, теперь прекрасно можно
построчно обрабатывать и печатать текстовые файлы, без ASCII драйвера.
1. Считаем, что перенос строк это <13,10>;
2. Юзаем безопасный SUB, вместо индексированной строки;
3. Обрабатываемую строку не модифицируем
			
			
									
						построчно обрабатывать и печатать текстовые файлы, без ASCII драйвера.

1. Считаем, что перенос строк это <13,10>;
2. Юзаем безопасный SUB, вместо индексированной строки;
3. Обрабатываемую строку не модифицируем
Код: Выделить всё
!   xStr_ - собственно сама строка для печати
Loc:SLen  Long   ! Длина строки (и флаг завершения печати)
Loc:Start Long   ! Позиция первого символа
Loc:CRLF  Long   ! Позиция символов переноса строки
   Code
   Loc:SLen  = Len(Clip(xStr_))   ! Длина строки
   Loc:Start = 1                  ! Начнём с начала
     Loop
       Loc:CRLF = InString('<13,10>', xStr_, 1, Loc:Start)  ! Найти позицию переноса
       If Loc:CRLF = 0             ! Если нет переноса -> печать хвостика и выход
          Loc:CRLF = Loc:SLen + 1  ! До конца файла
          Loc:SLen = -1            ! Установить флаг для завершения обработки
       end
       PRINT( Sub(xStr_, Loc:Start, Loc:CRLF - Loc:Start) )
       Loc:Start = Loc:CRLF + 2             ! Сдвиг позиции за перенос
       If Loc:Start > Loc:SLen then Break.  ! Если вылезли за размер строки
     end
За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						- morkovin
- Ветеран
- Сообщения: 937
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 12 раз
- Поблагодарили: 4 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Файл в строку:
StringTheory от CapeSoft
			
			
									
						StringTheory от CapeSoft
Loadfile (String FileName, Long Offset=0, Long Length=0, Long RemoveBOM=false)
Description
Loads a file off the disk, and places it in the current string value. The maximum size of the file is limited only by the maximum size of a string in Clarion (which is a around two gigabytes.) The existing contents of the object are discarded before the file is loaded.
WBR, morkovin
			
						- morkovin
- Ветеран
- Сообщения: 937
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 12 раз
- Поблагодарили: 4 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Там же (в StringTheory) есть и парсинг CSV-файлов. Я активно это использую. Работает очень шустро. Выглядит примерно так:
			
			
									
						Код: Выделить всё
        SETCURSOR(CURSOR:Wait)
        str.LoadFile('1.CSV')
        str.Split('<13,10>','"')
      loop x = 1 to str.Records()
        Lne.SetValue(Str.GetLine(x))
        Lne.Split(';','"','"',true)
        klk:F = LEFT(Lne.GetLine(1))   ! первое поле в строке
        klk:I = LEFT(Lne.GetLine(2))    ! второе поле
        klk:O = LEFT(Lne.GetLine(3))
        klk:DATEBIRTH=deformat(Lne.GetLine(4), @D06.)
        klk:POL=LOWER(Lne.GetLine(5))
        klk:POLIS=Lne.GetLine(6)
        klk:ADRESSPROP=Lne.GetLine(7)
        klk:ID_OsnObuch=1 !Lne.GetLine(8)
          .... и т. д.
         klk:KodPodrazd=Lne.GetLine(36)
         klk:MestoRojd=Lne.GetLine(37)
         klk:ADRESSDOM=Lne.GetLine(38)
            IF  Access:klk_abit.TryInsert()=Level:Benign THEN
            CLEAR(KLK:Record)
        END
      END
     SETCURSOR()      
WBR, morkovin
			
						- Игорь Столяров
- Ветеран движения
- Сообщения: 8269
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
Работа с текстовым файлов как с строкой
Это уже больше похоже на "ручную" обработку файла BASIC драйвером, а не ASCII.
Что кстати, тоже в моих планах есть, но следующим актом марлезонского балета …

И, кстати, т.к. BASIC драйвер построен на ASCII - то и тупит он точно также … поэтому не удивительно,
что в различных наборах шаблонов пытаются его заменить на работу со строкой в памяти.
Логично, разумно и очень эффективно (скорость обработки на больших текстовых файлов возрастает на порядок).
За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						- morkovin
- Ветеран
- Сообщения: 937
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 12 раз
- Поблагодарили: 4 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Мне не приходится объявлять никакие BASIC- и ASCII-файлы в словареобработку файла BASIC драйвером, а не ASCII
WBR, morkovin
			
						- Игорь Столяров
- Ветеран движения
- Сообщения: 8269
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
Работа с текстовым файлов как с строкой
Объявлять структуру текстовых файлов в словаре - это конечно же анахронизм, но по ходу работы программы,morkovin писал(а): 17 Октябрь 2018, 9:32 Мне не приходится объявлять никакие BASIC- и ASCII-файлы в словаре
в различных процедурах приходится (точнее раньше приходилось) объявлять различные текстовые файлы для обработки.
Например, дёрнуть страничку с сайта и распарсить и т.д.
Много есть задач с обработкой текстовых файлов, так или иначе ...
За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						- morkovin
- Ветеран
- Сообщения: 937
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 12 раз
- Поблагодарили: 4 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Главный объект в StringTheory - это "строка" (с динамическим выделением памяти)объявлять различные текстовые файлы для обработки
Объявил нужные объекты:
st StringTheory
st1 StringTheory
....
и дальше делай с ними любые манипуляции
st.SetValue('hello world')
st.LoadFile('c:\windows\win.ini')
st.ToBlob(IniData.Text)
st1.FromBlob(IniData.Text)
myBlobContents = st1.GetValue()
и др.
WBR, morkovin
			
						- Игорь Столяров
- Ветеран движения
- Сообщения: 8269
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
Работа с текстовым файлов как с строкой
Не вызывает сомнений. Вы описываете, как пользоваться готовым инструментом для работы со строками.
А я пытаюсь этот инструмент реализовать …

За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						- morkovin
- Ветеран
- Сообщения: 937
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 12 раз
- Поблагодарили: 4 раза
- Контактная информация:
Работа с текстовым файлов как с строкой
Не опоздал?А я пытаюсь этот инструмент реализовать …
 
 Там всё в исходных кодах. Бери и рихтуй.
WBR, morkovin
			
						- Игорь Столяров
- Ветеран движения
- Сообщения: 8269
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 34 раза
- Поблагодарили: 106 раз
Работа с текстовым файлов как с строкой
Та в принципе, не такая уж сложная задача, на самом деле-то …

Намного интересней разобраться и сделать, чем копаться в чужих классах, где куча всего разного (и мне не нужного).

За теми, кто отстал, не возвращаться !  Кодекс
 Кодекс
			
						




