Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

FileRead(Write)


Страницы:   1 2

SMAC ©   (2006-02-27 18:20:00) 

Ув. мастера!

Мои данные представляют из себя таблицу и хранятся в текстовом ASCII файле. Например:

0,1 123 544 600
0,2 124 544 650
...
1,1 127 545 800
...

Файл довольно большой (неск. мегабайт). Хочу загрузить в свою программу как массив (а потом обработать). Быстро.
Если же читаю файл с данными построчно и разделяю на фрагменты, а потом еще и перевожу из строк в числа - получается очень медленно.
Похожим извращением я занимался тогда, когда примерно таким же способом загружал текстовый файл в TMemo несколько лет назад. А оказалось, что есть такая штука как LoadFromFileи всё встало на свои места. Есть ли аналогичные методы и для моего случая?

Интересует также и запись в файл (потом, после обработки).

Заранее спасибо.


SMAC   (2006-03-01 10:20:00) [1]

Всем спасибо.

Меня устраивает TStringList. Во всяком случае пока. Выигрыш по времени колоссальный.

Насколько я понимаю есть только неумолимое ограничение в 2147483647 ($7FFFFFFF)строк (тип integer). Но у меня даже при 10Мб файле количество строк около 350000 ($55555). Запас более чем достаточный, в несколько тысяч. В связи с этим хочу предположить, что ограничение в 10Мб от Eraserбыло получено не без использования Randomize. :)

Мне хотелось разделить процесс загрузки данных из файла от процесса обработки, минимизировать по времени первый процесс и это всё получилось.

Ещё раз спасибо всем.

ЗЫ
А вот про запись данных в файл я видимо погодя темку создам. ;)


SMAC   (2006-02-28 18:30:00) [2]

Я к тому, что похожий файл можно сгенерить самомтоятельно скажем в Excel.

Столбец A: значения от 0 с шагом 0,1
Столбец B: функция вида SIN(A1/100)*20+COS(A1/10)*80
Столбец C: функция вида SIN(A1/5)*20+COS(A1/10)*80
и т.д.

Растянуть до конца листа и сохранить в *.txt или *.csv с разделителями запятыми, а потом в том же Word заменить запятые на пробелы.
Файл будет весить около 2Мб (при трех столбцах). Потом можно склеить раз пять и будут все 10Мб.

Ей-богу будет тот же объем и чистота эксперимента нарушится минимально.


SMAC   (2006-02-28 18:24:00) [3]

Mikhail V!

Ничего, что 2Мб кусок файла в RAR-архиве с максимальным сжатием будет весить около 1 Мб?

"Представления о жизни бывают разные"


SMAC   (2006-02-28 17:56:00) [4]

Короче я понял, что строковые представления чисел некаким методом кроме загрузки в TStringList никто кроме Mikhail Vпредложить не может?

Для Mikhail V.
Файлы дома. Завтра постараюсь не забыть и прислать один из них.

Всем спасибо.
"Завтра нас рассудит"


Mikhail V   (2006-02-28 16:25:00) [5]


> Zeqfreed ©  

> SMAC   (27.02.06 18:20)  
...Файл довольно большой (неск. мегабайт). ...

> SMAC   (28.02.06 15:55) [26]

Миллион способов сделать то, что Вы хотите. Напр. подключиться через
ODBC используя драйвер CVS и.т.д...
Бросте мне на мыло свой "довольно большой" файл (предварительно
заархивировав :)). Посмотрим, подумаем...


Сергей М.   (2006-02-28 16:12:00) [6]


> SMAC   (28.02.06 15:55) [26]


На то тебе и был намек - TStringList.LoadFromFile.

Исходные тексты доступны, проанализировать их и приспособить под свои нужды думающему человеку не составит труда.


Zeqfreed   (2006-02-28 16:05:00) [7]


> array of string делает бред

К счастью «array of string»'а, бред может делать только программист. Сомневаюсь, что отображение в память как-то поможет при обработке небольших объемов (вроде, у Вас набольшие?). Чем не понравилось чтение в TStringList и обработка его методами?


SMAC   (2006-02-28 15:55:00) [8]

Написал для проверки следующее:
procedure TForm1.Button1Click(Sender: TObject);
var
p1 : array of integer;
i : integer;
p : Pointer;
dw : DWORD;
begin
dw := Form1.MapFileData('c:\temp\data\data.txt', p);
p1 := p;
Memo1.Text := IntToStr(dw);
for i := 0 to dw-1 do
begin
Memo1.Text := Memo1.Text + ^m^j + IntToStr(p1[i]);
end;

Всё отлично работает, если принять, что данные хранятся в файле с данными в виде 32-битных интейджеров.

У меня же файле исключительно строковое представление данных (неважно - integer или extended). Как читать строковае представление? array of string делает бред.


Сергей М.   (2006-02-28 15:55:00) [9]


> Формат исходного файла - не БД, а обычный


Вот я и предлагаю импортданных из исх.файла в любую из подходящих БД


SMAC   (2006-02-28 15:33:00) [10]

Для Сергей М.Мне нужна дорога "из" а не "в".
Формат исходного файла - не БД, а обычный (см. пост [0]) текстовый файл.

Для Mikhail V.
Разбираюсь с указателями. Обидно, что в который уже раз.


Сергей М.   (2006-02-28 14:59:00) [11]


> Короче, не на один раз если это опять таки важно


Значит , тебе прямая дорога в СУБД ..


SMAC   (2006-02-28 14:58:00) [12]

Спасибо, Mikhail V.
Буду пробовать.


SMAC   (2006-02-28 14:57:00) [13]

Импорт данных необходимо делать всякий раз как нужно сделать расчет в другой программе. Файлом выходных данных этой программы пользуюсь не только я. Моя цель, не переписывая этой программы (на самом деле это не одна программа а пакет однотипных), обработать эти данные и переписать в уже мой выходной файл.
Ну вот и как считать это разовой задачей? Файлов данных десятки только уже предварительно отфильтрованных (кстати с помощью моей программы), а с учетом того, что на каждый "одобренный" еще с десяток промежуточных - и счет уже на сотни.
Короче, не на один раз если это опять таки важно.


Mikhail V   (2006-02-28 14:57:00) [14]


function MapFileData(const FileName: string; var Buffer: Pointer): DWORD;
var
 hFile: THandle;
 hMap: THandle;
begin
 hFile := FileOpen(FileName, fmOpenReadWrite or fmShareExclusive);
 if hFile <> INVALID_HANDLE_VALUE then
 begin
   Result := GetFileSize(hFile, nil);
   hMap := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, Result, nil);
   if hMap <> 0 then
   begin
     Buffer := MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
     CloseHandle(hMap);
   end;
   CloseHandle(hFile);
 end;
end;


Сергей М.   (2006-02-28 14:26:00) [15]


> SMAC   (28.02.06 14:02) [18]
> На 100% правильно поставленный вопрос - это уже практически
> ответ на него


Нет тех самых 100% в правильности твоего вопроса.
Хотя бы потому что ты изначально умалчиваешь, как часто требуется проделывать всю эту петрушку. Из-за этого и "телепаты" всплывают.
Если это разовый импорт, то и программу писать, возможно, нет повода ..


SMAC   (2006-02-28 14:02:00) [16]

Для Сергей М.
Я же тоже не телепат.
На 100% правильно поставленный вопрос - это уже практически ответ на него. Во всяком случае чтобы такой вопрос задать нужно уже практически всё по этому вопросу знать.


SMAC   (2006-02-28 13:53:00) [17]

Уже сходил по
"Пуск->Программы->Borland Delphi 5->Help->MS SDK Help Files".

Читаю по диагонали. Нового мало.

Как слить файл в буфер? Код можно?


Сергей М.   (2006-02-28 13:53:00) [18]


> Это только в том куске, который я привел, а так может быть
> произвольной


Какого ж ххх ты об этом не говоришь сразу? Телепатов тут нет.

И это резко осложняет "дело" ..


Mikhail V   (2006-02-28 13:30:00) [19]

Win32 Developer's References - входит в поставку Delphi


SMAC   (2006-02-28 13:18:00) [20]

Можно линк?
Желательно на FREE и лучше всего RU.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо