![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FileRead(Write)
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.