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, 15:34
Лучше всего разбить строку на подстроки, игнорируя все, что является пробельным символом. Результат загнать в TStrings. Далее попробовать сконвертить первый элемент из списка в DateTime. Если удалось - это строка с данными. Гоним ее в базу обычным INSERT'ом. Если нет - игнорируем и продолжаем цикл.
kskb7771
09.03.2010, 15:46
да я думал о примерно таком варианте.
взять целиком файл в массив. после искать строки начинающиеся с D и с дефиса их выбросить. далее разбить строку на подстроки, считать данные меж пробелов.
golubevsv
09.03.2010, 16: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, 22:17
спасибо)
отпишусь позже.
golubevsv
10.03.2010, 08:56
kskb7771, отписывайся, приводя код - так быстрее найдем решение )) Удачи.
kskb7771
11.03.2010, 20:36
С кодом тут неувязочка(((:(
если можно то в личку:
http://vkontakte.ru/id12280022
или
icq: 166-100-110
golubevsv
12.03.2010, 13:51
kskb7771, пиши в личку.
Демьян
29.03.2010, 13:12
А красивей применить к обработкам строк регулярные выражения
golubevsv
29.03.2010, 14:17
Демьян, и где в RTL регулярные выражения? Пример кода в студию.
kskb7771
29.03.2010, 14:37
Ребят я уже нашел решение:
ввод производится из *.тхт файла.
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;
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, 15:50
Ну вместо статичного XLApp можно было пользовать динамическое создание сервера автоматизации Excel в коде. Гибче оно было бы. Но это уже нюансы.