在考虑格式的前提下,怎样才能把数据库(Table或DBGrid)中的数据转化、导出到一个文本文件 (100分)

  • 主题发起人 主题发起人 incool
  • 开始时间 开始时间
I

incool

Unregistered / Unconfirmed
GUEST, unregistred user!
在考虑格式的前提下,怎样才能把数据库(Table或DBGrid)中的数据转化、导出到一个文本文件,我的数据库是这样的:

编号 姓名 QQ Email 学校
03 78901200 a@a.com 浙江大学
02 李四 b@hotmail.com 北京大学
01 张三 123456 清华大学
04 王五 45678 c@163.com

我以前也用过一个算法,但把它导出成为(没有数据的数据项的位置被后面的数据项填充了)



编号 姓名 QQ Email 学校
03 78901200 a@a.com 浙江大学
02 李四 b@hotmail.com 北京大学
01 张三 123456 清华大学
04 王五 45678 c@163.com


因为数据中存在空格,我要求导出的文本文件一样有空格

请给出完整算法和详细操作步骤(我很菜^_^)!
 
以下是我的源码,用ADODataSet,不用BDE,不影响源DataSet的指针,导出标题
procedure TDBMDIChildForm.DataSetExportExecute(Sender: TObject);
var
i,j:integer;
sf:string;
fl:TextFile;
rs:TADODataSet;
bt:boolean;
begin
inherited;
if dlgsave.Execute then
begin
sf:=dlgsave.FileName;
rs:=TADODataSet.Create(self);
rs.Clone(ADSMaster);
AssignFile(fl,sf);
Rewrite(fl);
try
bt:=false;
for j:=0 to rs.FieldCount-1 do
begin
if bt then write(fl,#9);
write(fl,rs.Fields[j].FieldName);
bt:=true;
end;
writeln(fl,#0);
for i:=0 to rs.RecordCount-1 do
begin
bt:=false;
for j:=0 to rs.FieldCount-1 do
begin
if bt then write(fl,#9);
write(fl,rs.Fields[j].AsString);
bt:=true;
end;
writeln(fl,#0);
rs.Next;
end;
finally
rs.Free;
CloseFile(fl);
end;
end;
end;
 
var
st:TStrings;
s:string;
i:Integer;
begin
s:=TStringList.Create;
table.First
while not(table.eof) do
begin
s:=table.Fields[0].AsString;
for i:=1 to table.FieldCount-1 do
s:=s+','+table.Fields.AsString;
st.add(s);
table.Next;
end
st.saveToFile('c:/temp.txt');
st.Free;
end;
 
我一定要用BDE,而不用ADO

楼上的算法好像编译不了:
[Error] Unit1.pas(729): Incompatible types: 'String' and 'TStringList'
[Error] Unit1.pas(731): Missing operator or semicolon
[Error] Unit1.pas(739): Missing operator or semicolon
[Fatal Error] Txl35.dpr(9): Could not compile used unit 'Unit1.pas'
是否缺了些什么?
 
这种错误,你自己修改一下,不就可以了
你不会Debug?和和,不好意思
 
s:=TStringList.Create;
改成:
st:=TStringList.Create;
 
to twos 我好菜啊,刚刚才知道那是什么意思^_^


to jsxjd 你的算法可以编译了,但效果跟我原来的算法都差不多啊:

procedure TForm1.SpeedButton1Click(Sender: TObject);//把DbGrid的数据导出
var f:textfile;
filestr1,fs,str:string;
i,j,k:integer;
begin
if not table1.IsEmpty then
begin
if savedialog1.execute then
begin
fs:=savedialog1.filename;
assignfile(f,fs);
rewrite(f);
for i:=0 to table1.FieldCount-1 do
begin
begin
str:=table1.Fields.Displaylabel;
for j:=table1.Fields.datasize to 35 do
begin
str:=str+' ';
end;
write(f,str);
end;
end;
writeln(f,'');
table1.first;
for i:=0 to table1.RecordCount-1 do
begin
for j:=0 to table1.FieldCount-1 do
begin
str:=table1.Fields[j].Displaytext;
for k:=table1.Fields[j].datasize to 35 do
begin
str:=str+' ';
end;
write(f,str);
end;
writeln(f,'');
table1.next;
end;
filestr1:=fs;
closefile(f);
end;
end
else
begin
showmessage('数据库没有内容!');
end;
end;

有没有更好的?
 
to incool:
不知你想做成什么?是不是项第一个的式样?--用控个把缺少的部分填满?
在delphi中很好做的嘛!

procedure toFormatTextFile(filename: string)
var
sline, sfield: string;
isize: integer;
st: Tstrings;
begin
st
end;

懒得些了,如果想要说一生,我已写好了个demo,发给你就是。
mike6912@sina.com
 
好啊!发给我啦
gyl_delphi@163.com
 
to MikeZ 你的算法已经基本能解决我的问题,但是输出的文本文件好像没有标题,怎么解决。
例如:我的数据库
姓名 性别 年龄
张三 男 40
李四 男 62
王五 女 45

而只能输出:(没有标题)
张三 男 40
李四 男 62
王五 女 45

关于你的代码我有点不明白(已在代码中注明),能否指教?

procedure TForm1.toFormatTextFile(FileName: string);
const
sizeType = [ftString, ftBCD, ftBytes, ftVarBytes, ftBlob, ftMemo, ftGraphic];
var
st: TStrings;
sRec, sField: string;
iSize, I: Integer;
begin
st := TStringList.Create;
try
Table1.First;
while not Table1.Eof do
begin
sRec := ''; //有什么作用,为什么要这样定义
for I := 0 to Table1.FieldDefs.Count - 1 do
begin
iSize := 10;
if Table1.FieldDefs.DataType in sizeType then //为什么要定义一个 sizeType 并在这里使用?
iSize := Table1.FieldDefs.Size;
sField := Copy(Table1.Fields.AsString + StringOfChar(' ', iSize), 0, iSize);//能否简单的给我讲一下 stringofChar这函数怎么用?
sRec := sRec + sField; //为什么要定义一个 sRec 并在这里和在数据库中取得的字段合并?
end;

st.Add(sRec);
Table1.Next;
end;

st.SaveToFile(FileName);
finally
st.Free;
end;
end;
 
to incool:
1、标题。两种方法实现。简单:在已知标题的情况下,
for I := 0 to FieldsNum - 1 do
sRec := sRec + Copy(Title + StringOfChar(' ', tSize), 0, tSize);

复杂:建立一张数据库表字段纪录表:
Create Table TableCols(
ID Int NOT NULL,
FieldName: VarChar(32),
Caption: VarChar(32),
Type: Integer;
Size: Integer;
....
)
通过这张表取得标题信息,按一上方法输出。


2、sRec := '';
sRec 表示一条纪录,在循环中去下一条纪录时,应该晴空。
3、sizeType:
因为除了在sizeType中的类型外,其他类型的FieldDef.Size = 0
4、StingOfChar:
function StringOfChar(Ch: Char; Count: Integer): string;
意为取得count 个 Ch 字符的字符串。可以插下帮助,在不明白的话!
5、sRec 对应 st中得一行

see u
 
to MikeZ
感谢你回答我的问题。但第一个好像出了点问题:总是编译不过

不是说:没定义就是(下面):
[Error] MainForm.pas(353): '(' expected but '[' found
[Error] MainForm.pas(353): '(' expected but '[' found
[Fatal Error] Txl35.dpr(21): Could not compile used unit 'MainForm.pas'

你能不能把把输出标题的代码,合并到原来导出文本文件的代码中?
 
又是这个incool,不要incool2又过来把分收掉了,你看别人多热心啊。
(不要嫌烦,最后一次提醒你)
 
2 incool:
诱发给你了!
 
一个文本文件格式如下:编号 ,姓名, QQ,Email ,学校,03,78901200, a@a.com,
浙江大学,02, 李四, b@hotmail.com ,北京大学
怎样把它读入到Sql Server 数据库中
 
多人接受答案了。
 
后退
顶部