Автор | Сообщение |
|
| постоянный участник
|
Пост N: 2467
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.12 12:21. Заголовок: Считать текстовый файл в массив ....
Всем привет. Столкнулся тут с проблемкой. Текстовые файлы (оплаты с банков) не всегда содержат в конце строки CHR(13)+CHR(10). Как правильно считать в массив построчно текстовые файлы ? Вариантов много, хочу найти лучший. По скорости наверно лучше: считать целиком файл в переменную FileStr() и потом построчно обрабатывать. Я делаю по Клиперному, а в хХарборе как еще можно ?
|
|
|
Ответов - 19
[только новые]
|
|
|
| |
Пост N: 2564
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.12 12:31. Заголовок: Andrey Длина строки..
Andrey Длина строки постоянная ? Закинь такой файлик на обменник , гляну.
|
|
|
|
| Администратор
|
Пост N: 2610
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.12.12 14:37. Заголовок: По клипперному и по ..
По клипперному и по харборному - так не бывает. Бывают разные алгоритмы, а реализовать их можно и в клиппере, и в харборе. Как лучше: считывать весь файл в строку или завести буфер и считывать файл поблочно - это зависит от предполагаемого размера файла. Если он небольшой - несколько десятков kb (для клиппера этот размер меньше), то можно считывать сразу весь файл. Если там мегабайты - то лучше считывать поблочно. Насчет разделителя строк - надо проверять все возможные. Я к примеру проверяю сначала наличие CHR(13)+CHR(10), и если такого нет - проверяю Chr(10)
|
|
|
|
| постоянный участник
|
Пост N: 2468
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.12 14:57. Заголовок: Dima пишет: Закинь ..
Dima пишет: цитата: | Закинь такой файлик на обменник , гляну. |
| Да они разные... и от вас тоже разные из банков приходят... Подготовлю и вышлю. Т.к. файлы идут каждый день, то размер небольшой меньше 100Кб. Я до этого пользовался функцией из Клипера Скрытый текст ************************************************************************* * Function : ROWS * Author : Michael Peters * Date : 09/14/90 * Usage : The text from a file is read and processed by the line. * What you are doing with the single rows within the * function is your turn. * * Notes : No blank lines are available! * A file size over 64 kB is not allowed! * See also: FTOKEN.PRG * * Example : DO ROWS WITH "C:\AUTOEXEC.BAT" * ************************************************************************** FUNCTION ROWS(cFileName) LOCAL cFileText, cLine IF "" <> FILESEEK(cFileName) cFileText := FILESTR(cFileName) TOKENINIT(@cFileText, CHR(13)+CHR(10), 2) // initialize ! @ ! DO WHILE .NOT. TOKENEND() * each row can be processed * for example converted in capital letters * cLine := TOKENNEXT(cFileText) // get next row ?? UPPER(cLine) + CHR(13) + CHR(10) ENDDO ENDIF RETURN(NIL)
| Хотя можно и проще сделать: 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 и более Мб. Что тогда делать ?
|
|
|
|
| |
Пост N: 2565
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.12 15:00. Заголовок: Andrey пишет: Подго..
Andrey пишет: Да не надо уже. К каждому банку свой подход , у меня так.
|
|
|
|
| Администратор
|
Пост N: 2611
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.12.12 15:16. Заголовок: Andrey пишет: Прост..
Andrey пишет: цитата: | Просто вот интересно и как правильно делать эти операции ? А если лог-файлы нужно обрабатывать по 300 и более Мб. Что тогда делать ? |
| Дык это еще зависит от того, на каком компьютере выполняется обработка. Если оперативки мало, да еще ее сьедает прожорливый антивирус, это одно, а если ее хоть залейся, много-много гиг - это другое. Использование TokenNext - это правильный подход, так как алгоритм "ползет" по строке, и ее огромная длина роли не играет. Надо исходить из наихудших возможных условий. Если это 256M с антивирусом, то лучше не делать огромных запросов на память, а считывать файл блоками по 16/32k. Если дело обстоит не так печально - можно глотать весь файл целиком.
|
|
|
|
| постоянный участник
|
Пост N: 2469
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.12 16:16. Заголовок: Спасибо большое за о..
Спасибо большое за объяснения ! А что например делать, если нужно обработать файл 300 Мб (логи сервера) и подсчитать статистику по нему: МАХ количество посещений с каждого IP-адреса, Кол-во посещений по пути /список путей/, Кол-во типов запроса GET ххх, POST хххх и т.д. ? Исходим из того что это сервер и памяти много...
|
|
|
|
| Администратор
|
Пост N: 2612
Зарегистрирован: 23.05.05
|
|
Отправлено: 14.12.12 16:36. Заголовок: Считывать файл разме..
Считывать файл размером в сотни мегабайт в строку, сколько бы ни было памяти на сервере, конечно, не стоит. Надо считывать файл блоками. Обоработал блок - считать следующий, приклеить к нему необработанный хвост с предыдущего блока, и на обработку.
|
|
|
|
| |
Пост 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. Можна загрузить файл в базу и там уже с ним работать.
|
|
|
|
| постоянный участник
|
Пост N: 2470
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.12 16:53. Заголовок: А примеры работы с H..
А примеры работы с HB_Fхххх() - есть ? santy пишет: цитата: | Можна загрузить файл в базу и там уже с ним работать. |
| А по быстродействию как будет ? Ведь обработка и запись в файл - медленная операция.... Или использовать HB_MEMIO ? А в МиниГуи HB_MEMIO использовать можно на Харборе ?
|
|
|
|
| |
Пост N: 147
Зарегистрирован: 16.12.08
|
|
Отправлено: 14.12.12 17:13. Заголовок: Andrey пишет: А при..
Andrey пишет: цитата: | А примеры работы с HB_Fхххх() - есть ? |
| \Harbour\contrib\hbmisc\tests Относительно работы с базой, нужно пробовать.
|
|
|
|
| постоянный участник
|
Пост N: 2472
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.12 17:22. Заголовок: santy пишет: \..
santy пишет: цитата: | \Harbour\contrib\hbmisc\tests |
| Спасибо !
|
|
|
|
|
| |
Пост N: 682
Зарегистрирован: 11.06.10
|
|
Отправлено: 14.12.12 17:26. Заголовок: Andrey пишет: Как п..
Andrey пишет: цитата: | Как правильно считать в массив построчно текстовые файлы ? |
| Можно изучить METHOD Source2Array( cSource ) CLASS HBFormatCode в harbour\contrib\hbformat\hbfmtcls.prg
|
|
|
|
| постоянный участник
|
Пост N: 2473
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.12 17:38. Заголовок: AlexMyr пишет: Можн..
AlexMyr пишет: цитата: | Можно изучить METHOD Source2Array( cSource ) CLASS HBFormatCode в harbour\contrib\hbformat\hbfmtcls.prg |
| Кстати, а как форматировать текст своего *.prg ? Я так и не вьехал в эту утилиту....
|
|
|
|
| |
Пост N: 683
Зарегистрирован: 11.06.10
|
|
Отправлено: 14.12.12 17:50. Заголовок: Andrey пишет: Я так..
Andrey пишет: цитата: | Я так и не вьехал в эту утилиту.... |
| в командной строке hbformat file.prg
|
|
|
|
| постоянный участник
|
Пост N: 2475
Зарегистрирован: 12.09.06
|
|
Отправлено: 14.12.12 18:20. Заголовок: AlexMyr пишет: в ко..
AlexMyr пишет: цитата: | в командной строке hbformat file.prg |
| Ни чего не происходит... Не форматирует !
|
|
|
|
| |
Пост N: 2567
Зарегистрирован: 17.05.05
|
|
Отправлено: 14.12.12 18:29. Заголовок: Andrey пишет: Не фо..
Andrey пишет: Форматирует !
|
|
|
|
| moderator
|
Пост N: 430
Зарегистрирован: 11.02.10
|
|
Отправлено: 14.12.12 18:56. Заголовок: Andrey пишет: Ни че..
Andrey пишет: Этой утилите не нравятся нестандартные команды типа END WINDOW, END TOOLBAR , END TREE Если их закоментировать в тексте программы, то форматирование проходит нормально (но надо не забыть расскомментировать затем эти строки )
|
|
|
|
| постоянный участник
|
Пост 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
|
|
|
|
| |
Пост N: 64
Зарегистрирован: 17.10.05
|
|
Отправлено: 17.12.12 10:33. Заголовок: обработка текстового..
обработка текстового файла путем загрузки его в базу, т.е. таблицу дбф - на самом деле по скорости не будет отличаться от всевозможных ухищрений с обработкой в оперативной памяти, тут самое главное - добиться чтобы строки текстового файла правильно распределились по записям базы. (delimited вам в помощь).
|
|
|
|