高手指点,读文本文件到数据库?(100分)

J

joann

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将下列文本文件中会计科目:0002的"客户名称","贷款帐号","合同号"数据读入数据库,字段名分别为khzh,dkzh,hth?

会计科目: 0001
===================================================================
客户名称 贷款帐号 合同号
-------------------------------------------------------------------
华小二 103035500100000079 019905500001600
何瑟 103035500100000078 019905500000500
...................
曹夹英 103035500100000176 019905500000900
-------------------------------------------------------------------
本页笔数: 45 本页金额: 2,950,033.15
-------------------------------------------------------------------



会计科目: 0002
===================================================================
客户名称 贷款帐号 合同号
-------------------------------------------------------------------
贺晓 103035500100000021 019905500001901
倪任尧 103035500100000004 019905500000101
..................
郑何方 103035500100000068 019905500000201
-------------------------------------------------------------------
本页笔数: 38 本页金额: 22,504,728.81
-------------------------------------------------------------------



会计科目: 0002
===================================================================
客户名称 贷款帐号 合同号
-------------------------------------------------------------------
李茜 103035500100000123 019905500001100
...................
万森林 103035500100000254 019905500001200
林国美 103035500100000085 019905500001300
-------------------------------------------------------------------
本页笔数: 27 本页金额: 22,504,728.81
-------------------------------------------------------------------



会计科目: 0003
===================================================================
客户名称 贷款帐号 合同号
-------------------------------------------------------------------
张望人 103035500100000023 019905500002800
何其一 103035500100000034 019905500004500
...................
赵达标 103035500100000045 019905500003500
-------------------------------------------------------------------
本页笔数: 46 本页金额: 22,504,728.81
-------------------------------------------------------------------
 
很麻烦啊![:(]
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1382820
 
会计科目: 0002
===================================================================
客户名称 贷款帐号 合同号
-------------------------------------------------------------------
李茜 103035500100000123 019905500001100
...................
万森林 103035500100000254 019905500001200
林国美 103035500100000085 019905500001300
如果這些不是數據表那就很麻煩,是的話就很簡單!
 
可以通过判断汉字和普通字母的区别而完成.如果是文本文件应该不会太难,原理应该是从文件头开始读.
搜索字符:会计科目:00002 等,找到后,一行一行的读(通过判断回车换行符号:#13#10),在再在这
行里面判断拥有的特征分割字符串.
不行的时候再帮你写吧.现在没有空.要睡觉了.
 
这类问题看起来复杂,想起来就简单了.只要你的文本格式构造是有规律的,程序就可以写了.最
怕没有规律.
 
初学Delphi,谁能写上一段?
 
发一份文本过来.sun_fsb@21cn.net
 
var
mylist:tstrings;
i,j:integer;
begin
mylist:=Tstringlist.create;
mylist.loadfromfile('你的文本文件名');
i:=1;
j:=1;
while i<=mylist.count do
begin
if mylist.strings='会计科目: 0002';
begin
i:=i+4;
while mylist.strings<>'-------------------------------------------------------------------' then
begin
//处理
将mylist.strings的内容进行分析然后得到各个数据即可。略。
i:=i+1;
end;
i;=i+1;
end;
end;
 
其实,不写程序从数据库中直接把文本文件的内容导入数据库也可以。
 
lyq2276959的程序执行出错!
 
我前些天也遇到过类似问题,不过我用了土办法
我用文本的方法读出来,TStringList.LoadFromFile,
加以判断,然后给每一行有用的数据做成一句SQL语句,执行写进数据库。

它有一个好处就是因为是你自己读出数据,可以添加很多功能,
例如数据检验(极大或者极小数据),数据格式检验之类。

当然,象你这种格式的文本需要过滤掉你的那个-----和======,
不过我觉得很容易就可以做到。
 
像这样的程序我也写过,不过当时只是为了完成工作,有点乱,你想要,发给你!
 
谢谢Imfish, moneyname@citiz.net
 
下面是我在其它地方找到的可能对你有用,不过耐心点:(我那个给你发过去注意查收)
jz_wq (2001-5-24 9:05:00)
如何把.txt文件中的数据写入数据库中。
例:.txt 文件数据如下
8401 012000 1756 89123  081110291 0008
   012000 1756 89123  081110291 0008
8401 012000 1756 89123  081110291 0098 200012
8401 012000 1756 89123  081110291 0002
436 012000 1756 89123  081110291 0118
8401 012000 1756 89123  081110291 0011



creation-zy (2001-5-24 9:12:00)
既然每列数据的位置都能够确定,就一列一列的Copy
从一行中按顺序读出各个字段(字符串形式)
|
逐个字段判断是否全为空格
| |
|N |Y
| |
IntToStr Null
写入数据库的相应字段

snjat (2001-5-24 9:14:00)
这个很简单。

对TXT文件你可以按行读出,再把每行数据按空格拆分,拆分时记录一下拆分数。

用程序建数据库,做个循环,把数据放入库中。你可以把它做成函数.

吴其华 (2001-5-24 9:22:00)
我贴一个极为类似的程序,只不过该程序中只实现两列的读取,多列的读取可自行推出
var
str:Tstrings;
i,j,strlength:integer;
strline:string;
wd:string;
translate:string;
begin
if OpenDialog1.Execute then
begin
str:=Tstringlist.Create;
str.LoadFromFile(Opendialog1.FileName);
end;
for i:=0 to str.Count-1 do
begin
strline:=str.Strings;
j:=pos(#9,strline);
table1.Append;
wd:=copy(strline,0,j-1);
table1.FieldValues['word']:=wd;
strlength:=length(strline);
translate:=copy(strline,j+1,strlength-j+10);
table1.Post;
end;
str.free;
end;

zqs10597249 (2001-5-25 11:48:00)
to jz_wq:
我做了个小程序,要发给你吗?
思路是这样的:
//先载入文本到MEMO控件里
if opentxt.Execute then//opentxt是TOpenDialog控件
begin
filename:=trim(opentxt.FileName);
memo1.Lines.Clear;
memo1.Lines.LoadFromFile(trim(opentxt.FileName));
if memo1.Lines[0]='*' then
application.MessageBox('此文本载已过,不能载入系统!','系统提示',
MB_ICONerror+MB_OK);
button2.Enabled:=true;
end
else
application.MessageBox('文本载入出错!','系统提示',
MB_ICONerror+MB_OK);
//然后用分隔符把文本的一列一列分开和数据库的字段对应连接
//接着把MEMO1的一列一列地插入到表里对应的字段里


山泉 (2001-5-25 17:21:00)
用access 新建db1,导入文本数据 数据间分割选择" " ,就ok ,
写程序 连续用read 分割用" '也ok

yangkee (2001-5-25 17:31:00)
类似编译程序的词法分析?

bronzestar (2001-5-25 22:03:00)
听:
1。先将文件读入memo或 richedit中 调用lines(I:为行号)。然后逐行处理。
2。调用如copy ,delete等函数将你所需的字段加入数据库中相应字段(.txt中得数据
必须是规则的),其中的规则就靠你自己了。不妨编几个判断规则的函数!很方便的。


htw (2001-5-26 0:31:00)
用手工的方法:用excel调用该TXT文件,另存为dbf,再用datapump转为你想要的数据库格式
程序的办法: 自己写代码吧。
或者考虑用ODBC连接此TXT文件

jz_wq (2001-5-28 9:52:00)
多谢大家了,能给我一个详细的例子吗?

zqs10597249 (2001-5-30 7:23:00)
抄的给你一个:
用Delphi实现将纯文本资料转入数据库

  在我们日常工作中,常会碰到这样一个难题:一大堆收集好的纯文本格式,比较规整的资料怎样才能将它们分离,转到自己已经建好的数据库中进行管理呢?例如,有一段人事档案资料document.txt,内容如下:

  张强,25,助理工程师,

  王宏,30,工程师,

  李远,45,高级工程师,

  要将它转入数据库中,document.db结构如下:

  姓名,年龄,职称

  怎么办呢?现在通过使用delphi编程,很好地解决了这个难题。Delphi提供了许多功能强大,丰富的字符处理函数和过程,常用的有:

  ① function Length(S:String):Integer  //返回串的长度

  ② function Copy(S:String; Index,Count: Integer):String

  //给出一个字符串中串的拷贝

  ③ function Pos(Substr:String; S:String); Integer  

  //查找子串在字符串中的位置

  ④ Procedure Delete(Var S:String; Index,Count: Integer);

  //从一个字符串中去除子串

  利用Delphi提供的已有函数和过程基础上编制自己的三个函数,实现了纯文本格式资料转入数据库功能。只要Delphi支持的数据库都可以支持。

  Document.txt中每行数据为一个字符串,字符串中每个被分割的数据为一个字段,分割每个字段的字符为分割符,这里是逗号,也可以是、;#等符号。具体思想是:先将字符串进行调整,然后把串中每个字符同分割符比较,将不是分割符的字符追加到MyStr串中,最后得到一个字段的内容。通过一个循环,就可以将一个字符串分成几个字段。

  Function GetSubStr(var aString:string; SepChar:String): String;

  //得到字符串中一个子串

  因要改变参数aString的值,所以将它用var定义。

  Function GetSubStrNum(aString, SepChar: String): Integer;

  //计算一个字符串要被分割成几个字段。

  参数:aString是所需分割的一个字符串,

  SepChar是分割符。
  Function GetSubStrNum(aString:String;SepChar:String):integer;
  var
  i:Integer;
  StrLen:Integer;
  Num:Integer;
  begin
  StrLen:=Length(aString);
  Num:=0;
  For i:=1 to StrLen do
  If Copy(aString,i,1) = SepChar then
  Num:=Num+1;
  result:=Num;
  end;
  Function GetSubStr(var aString:String;SepChar:String):String;
  var
  Mystr:String;
  StrLen:Integer;
  SepCharPos:Integer;
  begin
  StrLen:=Length(aString);
  SepCharPos:=Pos(SepChar,aString); //计算分割符在子串中的位置
  MyStr:=Copy(aString,1,SepCharPos-1); //将分割符前所有字符放到mystr串中
  Delete(aString,1,SepCharPos); //除去分割符和分割符前的子串
  GetSubStr:=MyStr; //返回一个字段
  end;

  有了上面三个函数,现在介绍一下具体的应用:

  ① 首先建立一个窗体Forml,加入一个RichEditl(或Menol),一个按钮Buttonl和一个Tablel,设置Tablel的属性:

  Tablell.DataBaseName:= 'c:/test';

  Tablell.TableName:= 'document.db';

  ② 分别加入以下程序:

  const
  SepChar=',' ;
  procedure TForm1.FormCreate(Sender: TObject);
  begin
  RichEdit1.Lines.LoadFromFile('c:/test/test.txt');
  end;
  procedure TForm1.Button1Click(Sender: TObject);
  var
  i,j,num:Integer;
  MyLine:String;
  item:array[1..3] of string;
  begin
  For i:=0 to RichEdit1.Lines.Count-1 do
  begin
  MyLine:=Richedit1.Lines;
  num:=GetSubStrNum(myline,SepChar);
  for j:=1 to num do
  item[j]:=GetSubStr(myline,SepChar);
  table1.open;
  with table1 do
  begin
  table1.insert;
  table1name.Asstring:=item[1];
  table1age.Asinteger:=strtoint(item[2]);
  table1title.Asstring:=item[3];
  table1.post;
  end;
  table1.close;
  end;
  end;



 
换一个思路,把会计科目: 0002中的有效数据提出来另存temp.txt,再读入数据库,如何写?
 
收到了吗?
 
发给我一份可以吗?hbxyk@ufsoft.com.cn谢谢!
 
接受答案了.
 
顶部