On-line: гостей 2. Всего: 2 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 2467
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 12:21. Заголовок: Считать текстовый файл в массив ....


Всем привет.
Столкнулся тут с проблемкой.
Текстовые файлы (оплаты с банков) не всегда содержат в конце строки CHR(13)+CHR(10).

Как правильно считать в массив построчно текстовые файлы ?
Вариантов много, хочу найти лучший.
По скорости наверно лучше: считать целиком файл в переменную FileStr() и потом построчно обрабатывать.
Я делаю по Клиперному, а в хХарборе как еще можно ?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 19 [только новые]


администратор




Пост N: 2564
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.12 12:31. Заголовок: Andrey Длина строки..


Andrey
Длина строки постоянная ?
Закинь такой файлик на обменник , гляну.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2610
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.12.12 14:37. Заголовок: По клипперному и по ..


По клипперному и по харборному - так не бывает. Бывают разные алгоритмы, а реализовать их можно и в клиппере, и в харборе.
Как лучше: считывать весь файл в строку или завести буфер и считывать файл поблочно - это зависит от предполагаемого размера файла. Если он небольшой - несколько десятков kb (для клиппера этот размер меньше), то можно считывать сразу весь файл. Если там мегабайты - то лучше считывать поблочно.
Насчет разделителя строк - надо проверять все возможные. Я к примеру проверяю сначала наличие CHR(13)+CHR(10), и если такого нет - проверяю Chr(10)

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2468
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 14:57. Заголовок: Dima пишет: Закинь ..


Dima пишет:

 цитата:
Закинь такой файлик на обменник , гляну.


Да они разные... и от вас тоже разные из банков приходят...
Подготовлю и вышлю.

Т.к. файлы идут каждый день, то размер небольшой меньше 100Кб.
Я до этого пользовался функцией из Клипера
Скрытый текст


Хотя можно и проще сделать:
cLine := FILESTR(cFileName)
aFile := HB_ATokens( cLine, CHR( 13 ), .T., .T. )
// Удалить спереди знак CHR(10)
FOR nI := 1 TO LEN(aFile)
aFile[nI] := CHARREM(CHR(10), aFile[nI])
NEXT
.................
Я пробовал до 1 Мб - файлы обрабатываются 2-3 сек.
Просто вот интересно и как правильно делать эти операции ?

А если лог-файлы нужно обрабатывать по 300 и более Мб. Что тогда делать ?



Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2565
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.12 15:00. Заголовок: Andrey пишет: Подго..


Andrey пишет:

 цитата:
Подготовлю и вышлю.


Да не надо уже.
К каждому банку свой подход , у меня так.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2611
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.12.12 15:16. Заголовок: Andrey пишет: Прост..


Andrey пишет:

 цитата:
Просто вот интересно и как правильно делать эти операции ?

А если лог-файлы нужно обрабатывать по 300 и более Мб. Что тогда делать ?



Дык это еще зависит от того, на каком компьютере выполняется обработка. Если оперативки мало, да еще ее сьедает прожорливый антивирус, это одно, а если ее хоть залейся, много-много гиг - это другое.
Использование TokenNext - это правильный подход, так как алгоритм "ползет" по строке, и ее огромная длина роли не играет.
Надо исходить из наихудших возможных условий. Если это 256M с антивирусом, то лучше не делать огромных запросов на память, а считывать файл блоками по 16/32k. Если дело обстоит не так печально - можно глотать весь файл целиком.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2469
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 16:16. Заголовок: Спасибо большое за о..


Спасибо большое за объяснения !

А что например делать, если нужно обработать файл 300 Мб (логи сервера) и подсчитать статистику по нему:
МАХ количество посещений с каждого IP-адреса, Кол-во посещений по пути /список путей/, Кол-во типов запроса GET ххх, POST хххх и т.д. ?

Исходим из того что это сервер и памяти много...

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 2612
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 14.12.12 16:36. Заголовок: Считывать файл разме..


Считывать файл размером в сотни мегабайт в строку, сколько бы ни было памяти на сервере, конечно, не стоит.
Надо считывать файл блоками. Обоработал блок - считать следующий, приклеить к нему необработанный хвост с предыдущего блока, и на обработку.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 146
Зарегистрирован: 16.12.08
ссылка на сообщение  Отправлено: 14.12.12 16:42. Заголовок: Можна использовать ф..


Можна использовать функции работы с текстовыми файлами:

HB_FEof() Tests if the end-of-file is reached in the currently selected text file.
HB_FGoBottom() Moves the file pointer to the last line in a text file.
HB_FGoto() Moves the record pointer to a specific line in the currently selected text file.
HB_FGoTop() Moves the record pointer to the begin-of-file.
HB_FInfo() Retrieves status information about the currently selected text file.
HB_FLastRec() Returns the number of lines in the currently selected text file.
HB_FReadAndSkip() Reads the current line and moves the record pointer.
HB_FreadLN() Reads the current line and without moving the record pointer.
HB_FRecno() Returns the current line number of the currently selected text file.
HB_FSelect() Queries or changes the currently selected text file area.
HB_FSkip() Moves the record pointer in the currently selected text file.
HB_FUse() Opens or closes a text file in a text file area.

Можна загрузить файл в базу и там уже с ним работать.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2470
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 16:53. Заголовок: А примеры работы с H..


А примеры работы с HB_Fхххх() - есть ?

santy пишет:

 цитата:
Можна загрузить файл в базу и там уже с ним работать.


А по быстродействию как будет ?
Ведь обработка и запись в файл - медленная операция....

Или использовать HB_MEMIO ?
А в МиниГуи HB_MEMIO использовать можно на Харборе ?



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 147
Зарегистрирован: 16.12.08
ссылка на сообщение  Отправлено: 14.12.12 17:13. Заголовок: Andrey пишет: А при..


Andrey пишет:

 цитата:
А примеры работы с HB_Fхххх() - есть ?


\Harbour\contrib\hbmisc\tests

Относительно работы с базой, нужно пробовать.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2472
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 17:22. Заголовок: santy пишет: \..


santy пишет:

 цитата:

\Harbour\contrib\hbmisc\tests



Спасибо !

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 682
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 14.12.12 17:26. Заголовок: Andrey пишет: Как п..


Andrey пишет:

 цитата:
Как правильно считать в массив построчно текстовые файлы ?


Можно изучить METHOD Source2Array( cSource ) CLASS HBFormatCode в harbour\contrib\hbformat\hbfmtcls.prg

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2473
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 17:38. Заголовок: AlexMyr пишет: Можн..


AlexMyr пишет:

 цитата:
Можно изучить METHOD Source2Array( cSource ) CLASS HBFormatCode в harbour\contrib\hbformat\hbfmtcls.prg


Кстати, а как форматировать текст своего *.prg ?
Я так и не вьехал в эту утилиту....

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 683
Зарегистрирован: 11.06.10
ссылка на сообщение  Отправлено: 14.12.12 17:50. Заголовок: Andrey пишет: Я так..


Andrey пишет:

 цитата:
Я так и не вьехал в эту утилиту....


в командной строке hbformat file.prg

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2475
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 18:20. Заголовок: AlexMyr пишет: в ко..


AlexMyr пишет:

 цитата:
в командной строке hbformat file.prg



Ни чего не происходит... Не форматирует !

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2567
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 14.12.12 18:29. Заголовок: Andrey пишет: Не фо..


Andrey пишет:

 цитата:
Не форматирует !


Форматирует !

Спасибо: 0 
ПрофильЦитата Ответить
moderator




Пост N: 430
Зарегистрирован: 11.02.10
ссылка на сообщение  Отправлено: 14.12.12 18:56. Заголовок: Andrey пишет: Ни че..


Andrey пишет:

 цитата:
Ни чего не происходит


Этой утилите не нравятся нестандартные команды типа END WINDOW, END TOOLBAR , END TREE
Если их закоментировать в тексте программы, то форматирование проходит нормально (но надо не забыть расскомментировать затем эти строки )

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 2476
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 14.12.12 19:41. Заголовок: Теперь понял... Нуж..


Теперь понял...
Нужно еще сюда добавить такие команды:
@ 0,10 LABEL Label_9 WIDTH nWidth HEIGHT 40 ;
@ nHeight,0 PROGRESSBAR Progress_1 ;
RANGE 1,10 ;

END INI



Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 64
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 17.12.12 10:33. Заголовок: обработка текстового..


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

Спасибо: 1 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 33
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет