文本文件操作(导入数据表)(200分)

  • 主题发起人 主题发起人 freeflying
  • 开始时间 开始时间
F

freeflying

Unregistered / Unconfirmed
GUEST, unregistred user!
有一文本文件格式如下:
----
公司1
////
'1','2','3',
'4','2.3','5.2'
////
----
公司2
////
'1','3,'3.6',
'4','2.3','5.2',
////
----
公司3
////
'1','3,'3.6',
'4','2.3','5.2',
////
.....

如何把上面的文本文件导入到数据表中
表的格式如下
a b c d
1 2 3 公司1
4 2.3 5.2 公司1
1 3 3.6 公司2
4 2.3 5.2 公司2
......
 
先将文本文件处理一下,把它转变成CSV格式,例如:
'1','2','3',公司1
'4','2.3','5.2',公司1
'1','3,'3.6',公司2
'4','2.3','5.2',公司2
……
转变的过程就不用我说了,挺简单的,就是处理字符串了。

然后用SQL一句搞定:
select * into TableName
from OpenRowset('MSDASQL',
'Driver={Microsoft text Driver (*.txt; *.csv)};DefaultDir=D:/Test;',
'select * from Text.txt')
 
你先读取第一行,取得d的值,
后面就可以直接用下面的函数
function TfrmCustomer.WbdlDatabase(TbName,FileName:string):Boolean; //导入数据
var
ListString:TStringList;
ListJL:TStringList;
Str,StrSql:string;
i,j:integer;
limitedpos:integer;
begin
screen.Cursor :=crHourGlass;
StrSql := 'select * from '+TbName;
Query_tmp.Close;
Query_tmp.SQL.Clear;
Query_tmp.SQL.Add(StrSql);
Query_tmp.Open;
Result := False;
ListString := TstringList.Create;
ListJL := TStringList.Create;
ListString.LoadFromFile(FileName);
for i:=0 to ListString.Count-1 do
begin
screen.Cursor :=crHourGlass;
Gauge.MinValue :=0;
Gauge.MaxValue :=ListString.Count;
str := ListString.Strings;
ListJL.Clear;
while (Pos(',',Str)>0) or (str<>'') do
begin
limitedpos:=Pos(',',str);
if limitedpos <=0 then
begin
ListJL.Add(str);
Str := '';
end
else
begin
ListJL.Add(Copy(Str,1,limitedpos-1));
Str := Copy(Str,Pos(',',Str)+1,Length(Str));
end;
end;
Query_tmp.Append;
for J :=0 to Query_tmp.FieldCount-1 do
begin
if Query_tmp.Fields[j].DataType =ftAutoInc then Continue;
if Query_tmp.Fields[j].DataType =ftDateTime then
begin
if pos('-',ListJL.Strings[j])>0 then
Query_tmp.Fields[j].AsString :=trim(ListJL.Strings[j])
else
begin
if LIstJL.Strings[j]<>'' then
begin
ListJL.Strings[j] := Copy(ListJL.Strings[j],1,4)+'-'+Copy(ListJL.Strings[j],5,2)+'-'+Copy(ListJL.Strings[j],7,2);
Query_tmp.Fields[j].AsString := trim(ListJL.Strings[j]);
end;
end;
end
else
begin
if Query_tmp.Fields[j].DataType =ftInteger then
begin
Query_tmp.Fields[j].AsInteger :=StrToInt(ListJL.Strings[j]);
end;
if Query_tmp.Fields[j].DataType =ftBoolean then
begin
if (ListJL.Strings[j] ='0') or (ListJL.Strings[j] = 'False') then
Query_tmp.Fields[j].AsBoolean :=False
else
begin
if (ListJL.Strings[j] ='1') or (ListJL.Strings[j] = 'True') then
Query_tmp.Fields[j].AsBoolean := True;
end;
end
else
if ListJL.Strings[j]<>'' then
Query_tmp.Fields[j].AsString := trim(ListJL.Strings[j]);
end;
end;
Query_tmp.Post;
Gauge.Progress :=i+1;
end;
Result := True;
end;
 
请问RedBeret大侠,能不能详细说一下你的字符串转换过程,我就是对该过程不大懂
麻烦回答一下,谢谢
 
唉,看在200分的份上,还是简单写点代码吧,我没空调试,你自己去试一下吧:

var
list1, list2: TStrings;
i, x: integer;
begin
list1 := TStringlist.Create;
list1.LoadFromFile('d:/tmp.txt'); //你的原始文本文件
list2 := TStringlist.Create;
x := 1;
for i := 1 to list1.Count div 6 do
begin
list2.Add(list1.Strings[x + 2] + list1.Strings[x]);
list2.Add(list1.Strings[x + 3] + list1.Strings[x]);
x := x + 6;
end;
list2.SaveToFile('d:/csv.txt'); //处理后的CSV格式文件
end;
 
楼主还是自己动动脑,梅花香自苦寒来
 
这几天都没空上来看看了,首先感谢RedBeret,中鼎的热心回答,但可能我在表述问题的时候没说清楚,公司1和公司2的数据行数是不固定的,我想要做的是把每对////和/////中的数据循环导入表中。我现在搞不懂的是怎样循环读文本文件中的公司1数据出来然后导入表中,然后再读公司2的数据导入表中,一直到文本文件结束。
 
后退
顶部