On-line: гостей 1. Всего: 1 [подробнее..]
АвторСообщение





Пост N: 116
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 01.08.17 16:22. Заголовок: Разделить файл


Есть большой текстовый файл, нужно его поделить по числу строк. Например, кусками по 10 000 строк. Или по 100 000. Есть способ?

Понятно, что можно искать CHR(13)+CHR(10) и отрезать по кусочку, но как-то очень это долго. Причем, длительность еще не самая большая проблема.

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


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




Пост N: 6518
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.17 16:32. Заголовок: rvu if hb_fuse(T..


rvu
 
if hb_fuse(TMMP+sysname+".doc")#0
do while !hb_feof()
// считаем строки и пишем во временную строку , как набралось нужное кол-во строк , пишем эту строку в файл , Hb_memowrite
Cstr:=hb_freadln())
hb_fskip()
enddo


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



Пост N: 520
Зарегистрирован: 17.06.10
ссылка на сообщение  Отправлено: 01.08.17 16:39. Заголовок: А fread не шустрее ..



А fread не шустрее ? Читаем в цикле блок по 64К, парсим этот блок по строкам,
а затем к остатку клеим новые 64К.

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




Пост N: 6519
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.17 16:47. Заголовок: fil пишет: А fread ..


fil пишет:

 цитата:
А fread не шустрее ?


Тестить надо

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





Пост N: 117
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 01.08.17 17:07. Заголовок: Спасибо! Покопался н..


Спасибо! Покопался на форуме поиском, нашел примеры интересные. А есть руководство по Харбору, где бы эти и другие полезные функции были описаны? У меня есть какой-то файл, но в нем этих функций нет.

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




Пост N: 5455
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 01.08.17 19:54. Заголовок: Вот это будет шустре..


Вот это будет шустрее.

  cTxt := HB_Memoread("имя и путь к файлу") 
aDim := HB_ATokens( cTxt, CHR( 13 ) + CHR( 10 ), .T., .T. )

cTxt := ""
FOR nI := 1 TO LEN(aDim)
// здесь обработка строк и запись по кускам
// HB_MemoWrit("имя файла для записи", cTxt)
NEXT



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




Пост N: 6520
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 01.08.17 21:29. Заголовок: Andrey пишет: Вот э..


Andrey пишет:

 цитата:
Вот это будет шустрее.


Вполне возможно.

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





Пост N: 118
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 03.08.17 09:57. Заголовок: hb_freadln() разбива..


hb_freadln() разбивает строчку на две, если ее длина больше, чем 4096 знаков. Что для меня не подходит. Или отслеживать длину всех строк и потом ошибочные склеивать, или все-таки искать CHR(13)+CHR(10).

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


Пост N: 1545
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 03.08.17 10:05. Заголовок: rvu пишет: Или отсл..


rvu пишет:

 цитата:
Или отслеживать длину всех строк и потом ошибочные склеивать, или все-таки искать CHR(13)+CHR(10)



или переопределить размер буфера

#define _B_SIZE 4096
=>
#define _B_SIZE 32768

и перекомпилировать библиотеку


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





Пост N: 119
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 03.08.17 11:05. Заголовок: Библиотека hbmisc.li..


Библиотека hbmisc.lib? А где взять исходник? Я пользуюсь MiniGUI, .lib файл там такой есть, но что в него компилировать? В установленный у меня харбор полез искать, там явно версия другая, чем в MiniGUI.
Вообще, если не сложно, расскажите подробнее.

Какой-то харбор скачал, тему про компилирование библиотеки нашел, чуть позже попробую. Но если есть какие-то специфические особенности, подскажите, пожалуйста.

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




Пост N: 6521
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.17 11:58. Заголовок: rvu пишет: hb_fread..


rvu пишет:

 цитата:
hb_freadln() разбивает строчку на две, если ее длина больше, чем 4096 знаков


После первой автоматом не дописывается CRLF ?

Андрей выше предлагал еще вариант.

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





Пост N: 120
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 03.08.17 12:12. Заголовок: Dima пишет: После п..


Dima пишет:

 цитата:
После первой автоматом не дописывается CRLF ?



Она дописывает его и после первой части и после второй. И вместо одной строки получается две.


Dima пишет:

 цитата:
Андрей выше предлагал еще вариант.



Я помню про него, но сначала хотел с тем вариантом разобраться.

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





Пост N: 121
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 03.08.17 17:44. Заголовок: А в HB_Memoread() то..


А в HB_Memoread() тоже, наверное, ограничения по размеру есть? У меня файл большой, около 10 гигов.

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




Пост N: 6522
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.08.17 21:30. Заголовок: rvu пишет: У меня ф..


rvu пишет:

 цитата:
У меня файл большой, около 10 гигов


Что в нем живет , все собрания сочинений В.И. Ленина ?

ЗЫ
HB_Memoread виснет или что ? Может надо просто подождать , размер то не слабый....

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




Пост N: 1118
Зарегистрирован: 20.02.11
ссылка на сообщение  Отправлено: 03.08.17 22:33. Заголовок: rvu пишет: У меня ф..


rvu пишет:

 цитата:
У меня файл большой, около 10 гигов.


Скорее всего будет ошибка при попытке выделить память.
Нужно читать блоками и парсить блоки как предложил Андрей,
возвращаясь при чтении назад на размер последнего элемена массива.
При этом игнорировать этот последний элемент. Это на тот случай если в нем
только часть строки.
Для файлов вменяемого размер предложение Адрея оптимально.


Задача на 10 минут

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




Пост N: 5456
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 03.08.17 22:46. Заголовок: Haz пишет: Задача н..


Haz пишет:

 цитата:
Задача на 10 минут


+1

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





Пост N: 122
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 04.08.17 07:29. Заголовок: Dima пишет: HB_Memo..


Dima пишет:

 цитата:
HB_Memoread виснет или что ?




Нет, в нем ограничение, просто не читает весь файл.

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





Пост N: 123
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 04.08.17 11:18. Заголовок: Haz пишет: Нужно чи..


Haz пишет:

 цитата:
Нужно читать блоками и парсить блоки как предложил Андрей, возвращаясь при чтении назад на размер последнего элемена массива. При этом игнорировать этот последний элемент. Это на тот случай если в нем только часть строки.




Казалось, что перекомпилировать библиотеку проще, но пока это не удалось.

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


Пост N: 1546
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 04.08.17 12:12. Заголовок: rvu пишет: Казалось..


rvu пишет:

 цитата:
Казалось, что перекомпилировать библиотеку проще, но пока это не удалось.



Это дело 5-ти минут.
Попробую пошагово описать (как смогу, если что - извините )

Исходные данные : MiniGUI у меня находится на диске C:, BCC на диске F:
Значит в \BATCH\minigui.cfg должны быть прописаны такие строки
MG_BCC=f:\borland\bcc55
MG_ROOT=c:\minigui

В BATCH\hbmk2.bat меняю эту строку
if not defined MG_BCC set MG_BCC=f:\borland\bcc55

Затем иду сюда (мы ведь помним, что MiniGUI для BCC построен на hb 3.2)
и с помощью зеленой кнопки загружаю архив с исходниками (Download Zip)

Извлекаю из указаного архива папку с библиотекой hbmisk и помещаю ее в c:\minigui\source, т.е. в папке Source у нас появилась еще одна папка hbmisk, а в ней нужные нам файлы.

Дальше, не сильно мудрствуя, набираю в командной строке команду
C:\MiniGUI\BATCH\hbmk2.bat C:\MiniGUI\SOURCE\hbmisc\hbmisc.hbp и запускаю ее на выполнение клавишей Enter (я работаю в Far и использую для таких случаев Ctrl + F, но это дело вкуса)

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

Если все работает, правим нужные файлы и опять перекомпилируем.
Вручную перемещаем (заменяем) библиотеку в папку C:\MiniGUI\Harbour\Lib\, но можем и файл проекта поправить - это как кому нравится, в общем несущественно для разовой работы.

Писал эту "инструкцию" дольше чем делал.
Куда вы сбросите файлы с исходниками - это тоже не важно: все имена папок являются вымышленными и любое совпадение с реально существующими или когда-либо существовавшими папками случайно


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




Пост N: 1624
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 04.08.17 12:43. Заголовок: rvu Очень давно (с ..


rvu
Очень давно (с S87) использую Скрытый текст



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





Пост N: 124
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 04.08.17 16:47. Заголовок: Петр пишет: Попробу..


Петр пишет:

 цитата:
Попробую пошагово описать (как смогу




Огромное спасибо, все работает! И написано очень доступно.

Всем спасибо за дельные советы!

Может быть, позднее попробую способ Андрея, тоже интересно.

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




Пост N: 5465
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 04.08.17 18:45. Заголовок: rvu пишет: Может бы..


rvu пишет:

 цитата:
Может быть, позднее попробую способ Андрея, тоже интересно.


Я не знаю, можно ли в переменную загнать 10 Гб ( я так понял это размер файла) ?
cTxt := HB_Memoread("имя и путь к файлу")

До 1 Гб делал. Нужно пробовать.

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





Пост N: 125
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 04.08.17 21:49. Заголовок: Andrey пишет: Я не ..


Andrey пишет:

 цитата:
Я не знаю, можно ли в переменную загнать 10 Гб ( я так понял это размер файла) ?




У меня не получилось. Я выше писал об этом.

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




Пост N: 5467
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.08.17 16:11. Заголовок: Всем привет ! Просто..


Всем привет !
Просто интересно:
1) Какая максимальная текстовая строка может быть в Харборе ?
2) Какой максимальный размер одномерного массива может быть в Харборе ?

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




Пост N: 3576
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.08.17 09:23. Заголовок: Ограничение длины ст..


Ограничение длины строки для Harbour 32-bit - 4Г, размер массива соответственно 4 млрд элементов. С хвостиком, естественно.
Для Harbour 64-bit - это 2^64 байт, или элементов. Это какие-то там сумасшедшие эксибайты, где-то 10 в 20й степени.
Но даже выделять гигабайты в программе крайне не рекомендуется. Если и хватит виртуальной памяти, это не будет способствовать стабильной работе OS. Выделять такой объем памяти под массив строк еще хуже, чем для одной строки, так как памяти понадобится больше.
Для работы с таким огромным массивом строк (если строка в среднем 50 байт, это будет 200 млн.строк) лучше сделать таблицу, можно и dbf, с полем скажем типа Variant (это разновидность memo). Сформировать эту таблицу, и ползать по ней, не перенапрягая несчастную операционную систему гигантскими запросами.


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





Пост N: 126
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 07.08.17 11:44. Заголовок: Pasha пишет: Но даж..


Pasha пишет:

 цитата:
Но даже выделять гигабайты в программе крайне не рекомендуется. Если и хватит виртуальной памяти, это не будет способствовать стабильной работе OS.




У меня есть еще одна задача, где я файл размером немного больше гига делю по строчкам. Компьютер с 4 гигами оперативки нормально к такому относится.


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


Пост N: 1319
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 07.08.17 13:23. Заголовок: rvu пишет: У меня е..


rvu пишет:

 цитата:
У меня есть еще одна задача, где я файл размером немного больше гига делю по строчкам. Компьютер с 4 гигами оперативки нормально к такому относится.


Может незаметно настать момент, когда файл будет гораздо больше и ОС им подавится. Присоединюсь к Павлу, лучше использовать dbf.

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




Пост N: 3577
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 07.08.17 13:52. Заголовок: Вот именно. У меня к..


Вот именно. У меня как раз комп с 4Г
Для harbour 32-bit выдаю

space(1000000000)

секунда задержки, и запрос выполняется

а для
space(2000000000)

программа сначала задумывается на несколько секунд, а затем вываливается с ошибкой 9006, хоть предел размера строки на 4Г не превышен.
ОС не смогла выполнить запрос. А может выполнить, но другая задача захлебнется от нехватки памяти.

Дополню: все это касается 64-битной ОС. Для 32-битной дело обстоит еще печальнее.

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




Пост N: 3578
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 08.08.17 08:57. Заголовок: Берем Harbour-64, ОС..


Берем Harbour-64, ОС и комп тот же: win7-64 и 4G RAM
запрашиваем
space(1000000000)

Без проблем, одна секунда - и все в порядке.
Поднимаем ставки
space(2000000000)
space(3000000000)
10-15 секунд задержки, но система справляется.

Идем на рекорд:
space(4000000000)
Программа "виснет" на несколько минут, ОС тоже, индикатор диска бешено мигает, но в конце концов запрос выполняется.
Затем пару минут ОС ведет себя несколько задумчиво и глючно, видимо, освобождает выделенную память. В конце концов работоспособность восстанавливается.
Дальше пробовать не стал.

Повторюсь: огромные объемы памяти запросить можно, но делать это не стоит. Это как участвовать в соревновании: кто больше скушает водки пельменей. Победить можно, но можно и помереть.


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

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