PDA

Просмотр полной версии : DELPHI & SQL



kskb7771
09.03.2010, 14:12
Здравствуйте!
Возникла одна ситуация:

есть txt файл с логами->

10/30/09 09:19AM 204 03 89263829489 00:00'36
10/30/09 09:27AM 129 09 <INCOMING> 00:00'05

Date Time Ext CO Dial Number Duration
--------------------------------------------------------------------------
10/30/09 09:33AM 115 06 <INCOMING> 00:00'45
10/30/09 09:44AM 129 09 <INCOMING> 00:00'26


Как лучше считать данные в Б.Д. SQLИ
Соответствующие поля в таблице я создал: Data,Time,Ext,Co и т.д.

И ЕСТЬ ОДНО "НО"- ШАПКА С НАЗВАНИЕМ КОЛОНОК ПОВТОРЯЕТСЯ ЧЕРЕЗ НЕКОТОРОЕ РАЗНОЕ КОЛИЧЕСТВО ЗАПИСЕЙ!

golubevsv
09.03.2010, 14:34
Лучше всего разбить строку на подстроки, игнорируя все, что является пробельным символом. Результат загнать в TStrings. Далее попробовать сконвертить первый элемент из списка в DateTime. Если удалось - это строка с данными. Гоним ее в базу обычным INSERT'ом. Если нет - игнорируем и продолжаем цикл.

kskb7771
09.03.2010, 14:46
да я думал о примерно таком варианте.
взять целиком файл в массив. после искать строки начинающиеся с D и с дефиса их выбросить. далее разбить строку на подстроки, считать данные меж пробелов.

golubevsv
09.03.2010, 15:30
Это будет двойная обработка, к тому же связанная с накладнымпи расходами на хранение изначально ненужных строк.

1-й проход - анализ всего массива и отброс мусорных строк.
2-й проход - обработка оставшихся строк с данными.

Это будет долго.

Проще так:
1. Бежим по всему файлу циклом while not EOF(FILE) do begin.....end
2. В каждой итерации цикла делаем то, что я ранее указал. Причем не делаем действия типа


try
ConvertToDateTime(...)
except
continue
end


а делаем



var
bResult: boolean;
TryConvertToDateTime(...,bResult);

if not bResult then
continue;

kskb7771
09.03.2010, 21:17
спасибо)
отпишусь позже.

golubevsv
10.03.2010, 07:56
kskb7771, отписывайся, приводя код - так быстрее найдем решение )) Удачи.

kskb7771
11.03.2010, 19:36
С кодом тут неувязочка(((:(

если можно то в личку:
http://vkontakte.ru/id12280022
или
icq: 166-100-110

golubevsv
12.03.2010, 12:51
kskb7771, пиши в личку.

Демьян
29.03.2010, 12:12
А красивей применить к обработкам строк регулярные выражения

golubevsv
29.03.2010, 13:17
Демьян, и где в RTL регулярные выражения? Пример кода в студию.

kskb7771
29.03.2010, 13:37
Ребят я уже нашел решение:
ввод производится из *.тхт файла.

procedure TForm2.BitBtn5Click(Sender: TObject);
var
fname:string; //Имя выбранного файла
f:TextFile; //Файловая переменная
i,j,k:integer;
s,ss:string;
row:array [1..6] of string;
s1,s2:TDateTime;
s3:integer;
s4,s5:string;
s6:real;

begin
if OpenDialog1.Execute then
begin

Memo1.Clear;
fname := OpenDialog1.FileName;
//Считываем информацию из текстового файла
AssignFile(f, fname); //Связываем файл с файловой переменной
Reset(f); //Открываем файл
while not eof(f) do //Будем считывать данные, начиная с 2ой строки,
//пока не будет достигнут конец файла
begin
ReadLn(f, s); //Считываем очередную строку
Memo1.Lines.Add(s); //Приписываем строку к содержимому невидимого компонента
//Memo. Таким образом, в Memo будет записан весь нужный
//нам текст
end;

CloseFile(f); //Закрываем файл

for i:=1 to Memo1.Lines.Count do
begin
s:=Memo1.Lines.Strings;
if length(s)=0 then continue;
if ((s[1]=' ') or (s[1]='-')) then continue;
k:=1;
for j:=1 to 6 do
begin
row[j]:='';
while s[k]=' ' do
begin
k:=k+1;
end;
while (s[k]<>' ') and (k<=length(s)) do
begin
row[j]:=row[j]+s[k];
k:=k+1;
end;
end;

DataModule7.Query1.Close;
DataModule7.Query1.SQL.Clear;
DataModule7.Query1.SQL.Add('REPLACE INTO Detalizaciya Values (');
ss:='';
row[2]:=TimeToStr(StrToTime(row[2]));
for j:=1 to 6 do
begin
if j<>1 then ss:=ss+',';
ss:=ss+QuotedStr(row[j]);
end;
ss:=ss+')';
DataModule7.Query1.SQL.Add(ss);
DataModule7.Query1.ExecSQL;
end;

end;
end;

[I]Добавлено через 2 минуты 27 секунд
Вот ещё один ввод, из EXCEL в базу:

procedure TForm2.BitBtn4Click(Sender: TObject);
var
WorkBk : _WorkBook;
WorkSheet : _WorkSheet;
K, R, X, Y : Integer;
IIndex : OleVariant;
RangeMatrix : Variant;
NomFich : WideString;
ss:string;
i,j:integer;
row:array [1..7] of string;
begin
if OpenDialog1.Execute then
begin
NomFich := OpenDialog1.FileName;
IIndex := 1;
XLApp.Connect;
// Excel
XLApp.WorkBooks.Open(NomFich,EmptyParam,EmptyParam ,EmptyParam,EmptyParam, EmptyParam,
EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyP aram, EmptyParam,EmptyParam,0);
WorkBk := XLApp.WorkBooks.Item;
WorkSheet := WorkBk.WorkSheets.Get_Item(1) as _WorkSheet;

WorkSheet.Cells.SpecialCells(xlCellTypeLastCell,Em ptyParam).Activate;

X := XLApp.ActiveCell.Row;

Y := XLApp.ActiveCell.Column;

StringGrid1.ColCount := Y;

RangeMatrix := XLApp.Range['A1',XLApp.Cells.Item[X,Y]].Value;

XLApp.Quit;
XLApp.Disconnect;
// TStringGrid
K := 1;
repeat
for R := 1 to Y do
StringGrid1.Cells[(R - 1),(K - 1)] := RangeMatrix[K,R];
Inc(K,1);
StringGrid1.RowCount := K + 1;
until
K > X;
// RangeMatrix
RangeMatrix := Unassigned;

begin
for i:=7 to StringGrid1.RowCount-1 do
begin
row[1]:=StringGrid1.Cells[1,i];
row[2]:=StringGrid1.Cells[4,i];
row[3]:=StringGrid1.Cells[7,i];
row[4]:=StringGrid1.Cells[13,i];
row[5]:=StringGrid1.Cells[18,i];
row[6]:=StringGrid1.Cells[22,i];
row[7]:=StringGrid1.Cells[24,i];

DataModule7.Query1.Close;
DataModule7.Query1.SQL.Clear;
DataModule7.Query1.SQL.Add('REPLACE INTO Napravlenie Values (');
ss:='';
for j:=1 to 7 do
begin
if j<>1 then ss:=ss+',';
ss:=ss+QuotedStr(row[j]);
end;
ss:=ss+')';
DataModule7.Query1.SQL.Add(ss);
//showmessage(DataModule2.Query1.Text);
DataModule7.Query1.ExecSQL;
end;

end;
end;



end;

[I]Добавлено через 1 минуту 13 секунд
в EXCEL так же инф-я о звонках, только с более чёткой детализацией по направлениям.

golubevsv
29.03.2010, 14:50
Ну вместо статичного XLApp можно было пользовать динамическое создание сервера автоматизации Excel в коде. Гибче оно было бы. Но это уже нюансы.