从TXT文件中读出数据,再写入数据表中,每项数据类型都要对应的,怎么写代码呢?

时间:2022-06-24 12:23:45
文本数据,如:1   gg   6  2008-07-12  9.365   False 

这条数据写入表bb中,分别对应的类型结果为:int char int datetime    float   bit

                                      1   gg   6  2008-07-12  9.365    1 (false在逻辑类型里显示为1) 


这种转换并写入表的过程应该怎么写呢?



难点在于要把纯字符串的内容再写入到表中的各种类型中去。

高手们帮我想想吧。

16 个解决方案

#1


想了好久了,请高手们帮我解决一下吧,让我也学点技巧,谢谢啦~~~~~~~~~~~

#2


AdoQuery1.Close;
AdoQuery1.Sql.Text:='insert into table(field1,field2,field3,field4,field5,field6) values(:v1,:v2,:v3,:v4,:v5,:v6)';
AdoQuery1.Parameters.ParamByName('v1').Value:=1;
AdoQuery1.Parameters.ParamByName('v2').Value:='gg';
AdoQuery1.Parameters.ParamByName('v3').Value:=6;
AdoQuery1.Parameters.ParamByName('v4').Value:=StrToDate('2008-07-12');
AdoQuery1.Parameters.ParamByName('v5').Value:=9.365;
AdoQuery1.Parameters.ParamByName('v2').Value:=false;
AdoQuery1.ExecSql;



#3


如果加上循环,让它自己一条条往里写,而不是我直接打字符串,怎么写呢?

我写的循环不对,一条也写不进。

#4


2楼的写法,是直接写进去了,若在已经取出20条记录的情况下,怎样把记录一条条写入呢?

#5




var
    strs,strsLine:TStringList;
    i:integer;
begin
    strs:=TStringList.Create;
    strs.LoadFromFile('c:\1.txt');
    strsLine:=TStringLIst.Create;

    for i:=0 to strs.Count-1 do
    begin
        strsLine.DelimitedText:=strs.Strings[i];

        AdoQuery1.Close;
        AdoQuery1.Sql.Text:='insert into table(field1,field2,field3,field4,field5,field6) values(:v1,:v2,:v3,:v4,:v5,:v6)';
        AdoQuery1.Parameters.ParamByName('v1').Value:=StrToInt(strsLine.String[0]);
        AdoQuery1.Parameters.ParamByName('v2').Value:=strsLine.String[1];
        AdoQuery1.Parameters.ParamByName('v3').Value:=StrToInt(strsLine.String[2]);
        AdoQuery1.Parameters.ParamByName('v4').Value:=StrToDate(strsLine.String[3]);
        AdoQuery1.Parameters.ParamByName('v5').Value:=strsLine.String[4];
        AdoQuery1.Parameters.ParamByName('v2').Value:=StrToBool(strsLine.String[2]);
        AdoQuery1.ExecSql;
    end;

    strsLine.Free;
    strs.Free;
end;


#6


我这有一段读取txt文件的小例了,你看一下
function TPaperImpl.ImportPrice: Boolean;
var
  vfile: TextFile;
  vfilePath,lineInfo:String;
  vOpenDialog: TOpenDialog;
  ID,Name,Code,BRecv,KaiPan,Price: String;
  i: integer;
begin
  vOpenDialog := TOpenDialog.Create(nil);
  try
    vOpenDialog.Filter := '*.txt';
    vOpenDialog.FileName:='*.txt';
    if not vOpenDialog.Execute then Exit;
    FAC.BeginTrans;
    try
      vfilePath := vOpendialog.FileName;
      AssignFile(vfile, vfilePath);
      reset(vfile);
      i:=0;
      while not eof(vfile) do
      begin
        readln(vfile,lineInfo);
        if i>0 then
        begin
          ID:=trim(copy(lineInfo,0,6));
          Name:=trim(copy(lineInfo,8,8));
          Code:=trim(copy(lineInfo,17,8));
          BRecv:=trim(copy(lineInfo,29,4));
          KaiPan:=trim(copy(lineInfo,37,4));
          Price:=trim(copy(lineInfo,45,4));
          //开始列新价格
          with FQ do
          begin
            Close;
            .....
            ExecSql;
          end;
        end;
        inc(i);
      end;
      closefile(vfile);
      Result := true;
      FAC.CommitTrans;
    except
      FAC.RollbackTrans;
      Result := false;
    end;
  finally
    vOpenDialog.Free;
  end;
end;

#7


5楼的方法好,利用TStringList来处理。

#8


我把数据从数据表写到TXT文件是用以下代码写的,但发现文本文件里一行记录都是连在一起的,怎样把每个数据分开呢?

不然再写回到数据库时,会认为这是一体的,只是一个数据.  提示错误:1gg62008-07-129.365False不是int型。


帮我看看读数据到文本的代码哪里欠妥?

procedure TForm1.Button2Click(Sender: TObject);
var
  F1:TextFile;
  str:string;
  j:integer;
begin

if SaveDialog1.Execute
 then
  begin
 AssignFile(F1,SaveDialog1.FileName);
 Rewrite(F1);

 with adoquery1 do
  begin
  close;
  sql.Clear;
  sql.Add('select * from aa ');
  open;
  first;
    for j:=1 to 20 do
       begin
        memo1.Lines.Add(adoquery1.fieldbyname('no').AsString+trim(adoquery1.fieldbyname('t1').AsString)+adoquery1.fieldbyname('t2').AsString+adoquery1.fieldbyname('t3').AsString+adoquery1.fieldbyname('t4').AsString+adoquery1.fieldbyname('t5').AsString);
        next;
       end;
   end;

 str:= '';
 str:= memo1.Lines.Text;
 writeln(f1,str);
 CloseFile(F1);

 showmessage('已完成保存!');
 end;

end;

#9


memo1.Lines.Add(adoquery1.fieldbyname('no').AsString+trim(adoquery1.fieldbyname('t1').AsString)+adoquery1.fieldbyname('t2').AsString+adoquery1.fieldbyname('t3').AsString+adoquery1.fieldbyname('t4').AsString+adoquery1.fieldbyname('t5').AsString);
你这中间也没有加个分隔符之类的,比如tab或分号

#10


你最好用INI文件存储数据,然后读出来就是一个一个的了,如果是文本文件还得根据格式一个一个的拆分,麻烦死了!
参考代码:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  SFileName: string;
begin
  {将配置文件 参数读出显示在edit}
  SFileName := ExtractFilePath(paramstr(0)) + 'MyTest.ini';
  if not FileExists(SFileName) then
    raise Exception.Create('文件不存在!')
  else
  begin
    Myinifile := TIniFile.Create(SFileName);
    edit2.Text := Myinifile.ReadString('小节名一','关键字1','');
    edit3.Text := Myinifile.ReadString('小节名一','关键字2','');
    edit4.Text := Myinifile.ReadString('小节名二','关键字1','');
    myinifile.Free;
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  SFileName: string;
begin
  {将配置文件 参数读出显示在edit}
  SFileName := ExtractFilePath(paramstr(0)) + 'MyTest.ini';
  Myinifile := TIniFile.Create(SFileName);
  Myinifile.WriteString('小节名一','关键字1',edit2.Text);
  Myinifile.WriteString('小节名一','关键字2','关键字2的内容');
  Myinifile.WriteString('小节名二','关键字1',edit4.Text);
  myinifile.Free;
end;

#11


从TXT文件中读出数据,再写入数据表中,每项数据类型都要对应的,怎么写代码呢?我用5楼的办法,现在可以写进数据了,但是最后会出一个错,什么问题?

#12


五楼的最后一个
AdoQuery1.Parameters.ParamByName ('v2').Value:=StrToBool(strsLine.String[2]);

改成V6

晕,你不会直接拿过去原封不动的就用了吧

#13


晕,我当然是改好了再用的了。我改好了才用的,这个我还是看的到的啦。

procedure TForm1.Button3Click(Sender: TObject);
var
strs,strsLine:TStringList;
i:integer;
begin
 if OpenDialog1.Execute then
begin
    strs:=TStringList.Create;
    strs.LoadFromFile(OpenDialog1.FileName);
    strsLine:=TStringLIst.Create;

    for i:=0 to strs.Count-1 do
    begin
        strsLine.DelimitedText:=strs.Strings[i];
        showmessage(strsLine.DelimitedText);
        AdoQuery2.Close;
        AdoQuery2.sql.Clear;
        AdoQuery2.Sql.Text:='insert into bb(no,t1,t2,t3,t4,t5) values(:v1,:v2,:v3,:v4,:v5,:v6)';
        AdoQuery2.Parameters.ParamByName('v1').Value:=StrToInt(strsLine.Strings[0]);
        AdoQuery2.Parameters.ParamByName('v2').Value:=strsLine.Strings[1];
        AdoQuery2.Parameters.ParamByName('v3').Value:=strsLine.Strings[2];
        AdoQuery2.Parameters.ParamByName('v4').Value:=StrToDate(strsLine.Strings[3]);
        AdoQuery2.Parameters.ParamByName('v5').Value:=StrTofloat(strsLine.Strings[4]);
        AdoQuery2.Parameters.ParamByName('v6').Value:=StrToBool(strsLine.Strings[5]);
        AdoQuery2.ExecSql;
        next;
    end;

    strsLine.Free;
    strs.Free;

 end;

showmessage('已完成保存!');

end;





错误提示:list index out of bound(0),数组越界?

#14


引用 13 楼 fufufu0529 的回复:
晕,我当然是改好了再用的了。我改好了才用的,这个我还是看的到的啦。 

procedure TForm1.Button3Click(Sender: TObject); 
var 
strs,strsLine:TStringList; 
i:integer; 
begin 
if OpenDialog1.Execute then 
begin 
    strs:=TStringList.Create; 
    strs.LoadFromFile(OpenDialog1.FileName); 
    strsLine:=TStringLIst.Create; 

    for i:=0 to strs.Count-1 do 
    begin 
        strsLine.Del…


你文本里大概有违法的语法数据吧,没有严格按照上面的结构?这里没考虑这个异常处理。

#15


OK了,我改好了,现在正常了.

多循环了一次,空循环了一次。

for i:=0 to strs.Count-1 do   改为 for i:=0 to strs.Count-2 do 

OK啦~~~~~~

谢谢各位~~~~~~太感谢了。

#16


不好意思,看来作为女性在编程方面的确有待加强。谢谢各位帮助,还好自己也动了一下小脑。呵~~~~~~~~

#1


想了好久了,请高手们帮我解决一下吧,让我也学点技巧,谢谢啦~~~~~~~~~~~

#2


AdoQuery1.Close;
AdoQuery1.Sql.Text:='insert into table(field1,field2,field3,field4,field5,field6) values(:v1,:v2,:v3,:v4,:v5,:v6)';
AdoQuery1.Parameters.ParamByName('v1').Value:=1;
AdoQuery1.Parameters.ParamByName('v2').Value:='gg';
AdoQuery1.Parameters.ParamByName('v3').Value:=6;
AdoQuery1.Parameters.ParamByName('v4').Value:=StrToDate('2008-07-12');
AdoQuery1.Parameters.ParamByName('v5').Value:=9.365;
AdoQuery1.Parameters.ParamByName('v2').Value:=false;
AdoQuery1.ExecSql;



#3


如果加上循环,让它自己一条条往里写,而不是我直接打字符串,怎么写呢?

我写的循环不对,一条也写不进。

#4


2楼的写法,是直接写进去了,若在已经取出20条记录的情况下,怎样把记录一条条写入呢?

#5




var
    strs,strsLine:TStringList;
    i:integer;
begin
    strs:=TStringList.Create;
    strs.LoadFromFile('c:\1.txt');
    strsLine:=TStringLIst.Create;

    for i:=0 to strs.Count-1 do
    begin
        strsLine.DelimitedText:=strs.Strings[i];

        AdoQuery1.Close;
        AdoQuery1.Sql.Text:='insert into table(field1,field2,field3,field4,field5,field6) values(:v1,:v2,:v3,:v4,:v5,:v6)';
        AdoQuery1.Parameters.ParamByName('v1').Value:=StrToInt(strsLine.String[0]);
        AdoQuery1.Parameters.ParamByName('v2').Value:=strsLine.String[1];
        AdoQuery1.Parameters.ParamByName('v3').Value:=StrToInt(strsLine.String[2]);
        AdoQuery1.Parameters.ParamByName('v4').Value:=StrToDate(strsLine.String[3]);
        AdoQuery1.Parameters.ParamByName('v5').Value:=strsLine.String[4];
        AdoQuery1.Parameters.ParamByName('v2').Value:=StrToBool(strsLine.String[2]);
        AdoQuery1.ExecSql;
    end;

    strsLine.Free;
    strs.Free;
end;


#6


我这有一段读取txt文件的小例了,你看一下
function TPaperImpl.ImportPrice: Boolean;
var
  vfile: TextFile;
  vfilePath,lineInfo:String;
  vOpenDialog: TOpenDialog;
  ID,Name,Code,BRecv,KaiPan,Price: String;
  i: integer;
begin
  vOpenDialog := TOpenDialog.Create(nil);
  try
    vOpenDialog.Filter := '*.txt';
    vOpenDialog.FileName:='*.txt';
    if not vOpenDialog.Execute then Exit;
    FAC.BeginTrans;
    try
      vfilePath := vOpendialog.FileName;
      AssignFile(vfile, vfilePath);
      reset(vfile);
      i:=0;
      while not eof(vfile) do
      begin
        readln(vfile,lineInfo);
        if i>0 then
        begin
          ID:=trim(copy(lineInfo,0,6));
          Name:=trim(copy(lineInfo,8,8));
          Code:=trim(copy(lineInfo,17,8));
          BRecv:=trim(copy(lineInfo,29,4));
          KaiPan:=trim(copy(lineInfo,37,4));
          Price:=trim(copy(lineInfo,45,4));
          //开始列新价格
          with FQ do
          begin
            Close;
            .....
            ExecSql;
          end;
        end;
        inc(i);
      end;
      closefile(vfile);
      Result := true;
      FAC.CommitTrans;
    except
      FAC.RollbackTrans;
      Result := false;
    end;
  finally
    vOpenDialog.Free;
  end;
end;

#7


5楼的方法好,利用TStringList来处理。

#8


我把数据从数据表写到TXT文件是用以下代码写的,但发现文本文件里一行记录都是连在一起的,怎样把每个数据分开呢?

不然再写回到数据库时,会认为这是一体的,只是一个数据.  提示错误:1gg62008-07-129.365False不是int型。


帮我看看读数据到文本的代码哪里欠妥?

procedure TForm1.Button2Click(Sender: TObject);
var
  F1:TextFile;
  str:string;
  j:integer;
begin

if SaveDialog1.Execute
 then
  begin
 AssignFile(F1,SaveDialog1.FileName);
 Rewrite(F1);

 with adoquery1 do
  begin
  close;
  sql.Clear;
  sql.Add('select * from aa ');
  open;
  first;
    for j:=1 to 20 do
       begin
        memo1.Lines.Add(adoquery1.fieldbyname('no').AsString+trim(adoquery1.fieldbyname('t1').AsString)+adoquery1.fieldbyname('t2').AsString+adoquery1.fieldbyname('t3').AsString+adoquery1.fieldbyname('t4').AsString+adoquery1.fieldbyname('t5').AsString);
        next;
       end;
   end;

 str:= '';
 str:= memo1.Lines.Text;
 writeln(f1,str);
 CloseFile(F1);

 showmessage('已完成保存!');
 end;

end;

#9


memo1.Lines.Add(adoquery1.fieldbyname('no').AsString+trim(adoquery1.fieldbyname('t1').AsString)+adoquery1.fieldbyname('t2').AsString+adoquery1.fieldbyname('t3').AsString+adoquery1.fieldbyname('t4').AsString+adoquery1.fieldbyname('t5').AsString);
你这中间也没有加个分隔符之类的,比如tab或分号

#10


你最好用INI文件存储数据,然后读出来就是一个一个的了,如果是文本文件还得根据格式一个一个的拆分,麻烦死了!
参考代码:

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  SFileName: string;
begin
  {将配置文件 参数读出显示在edit}
  SFileName := ExtractFilePath(paramstr(0)) + 'MyTest.ini';
  if not FileExists(SFileName) then
    raise Exception.Create('文件不存在!')
  else
  begin
    Myinifile := TIniFile.Create(SFileName);
    edit2.Text := Myinifile.ReadString('小节名一','关键字1','');
    edit3.Text := Myinifile.ReadString('小节名一','关键字2','');
    edit4.Text := Myinifile.ReadString('小节名二','关键字1','');
    myinifile.Free;
  end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  SFileName: string;
begin
  {将配置文件 参数读出显示在edit}
  SFileName := ExtractFilePath(paramstr(0)) + 'MyTest.ini';
  Myinifile := TIniFile.Create(SFileName);
  Myinifile.WriteString('小节名一','关键字1',edit2.Text);
  Myinifile.WriteString('小节名一','关键字2','关键字2的内容');
  Myinifile.WriteString('小节名二','关键字1',edit4.Text);
  myinifile.Free;
end;

#11


从TXT文件中读出数据,再写入数据表中,每项数据类型都要对应的,怎么写代码呢?我用5楼的办法,现在可以写进数据了,但是最后会出一个错,什么问题?

#12


五楼的最后一个
AdoQuery1.Parameters.ParamByName ('v2').Value:=StrToBool(strsLine.String[2]);

改成V6

晕,你不会直接拿过去原封不动的就用了吧

#13


晕,我当然是改好了再用的了。我改好了才用的,这个我还是看的到的啦。

procedure TForm1.Button3Click(Sender: TObject);
var
strs,strsLine:TStringList;
i:integer;
begin
 if OpenDialog1.Execute then
begin
    strs:=TStringList.Create;
    strs.LoadFromFile(OpenDialog1.FileName);
    strsLine:=TStringLIst.Create;

    for i:=0 to strs.Count-1 do
    begin
        strsLine.DelimitedText:=strs.Strings[i];
        showmessage(strsLine.DelimitedText);
        AdoQuery2.Close;
        AdoQuery2.sql.Clear;
        AdoQuery2.Sql.Text:='insert into bb(no,t1,t2,t3,t4,t5) values(:v1,:v2,:v3,:v4,:v5,:v6)';
        AdoQuery2.Parameters.ParamByName('v1').Value:=StrToInt(strsLine.Strings[0]);
        AdoQuery2.Parameters.ParamByName('v2').Value:=strsLine.Strings[1];
        AdoQuery2.Parameters.ParamByName('v3').Value:=strsLine.Strings[2];
        AdoQuery2.Parameters.ParamByName('v4').Value:=StrToDate(strsLine.Strings[3]);
        AdoQuery2.Parameters.ParamByName('v5').Value:=StrTofloat(strsLine.Strings[4]);
        AdoQuery2.Parameters.ParamByName('v6').Value:=StrToBool(strsLine.Strings[5]);
        AdoQuery2.ExecSql;
        next;
    end;

    strsLine.Free;
    strs.Free;

 end;

showmessage('已完成保存!');

end;





错误提示:list index out of bound(0),数组越界?

#14


引用 13 楼 fufufu0529 的回复:
晕,我当然是改好了再用的了。我改好了才用的,这个我还是看的到的啦。 

procedure TForm1.Button3Click(Sender: TObject); 
var 
strs,strsLine:TStringList; 
i:integer; 
begin 
if OpenDialog1.Execute then 
begin 
    strs:=TStringList.Create; 
    strs.LoadFromFile(OpenDialog1.FileName); 
    strsLine:=TStringLIst.Create; 

    for i:=0 to strs.Count-1 do 
    begin 
        strsLine.Del…


你文本里大概有违法的语法数据吧,没有严格按照上面的结构?这里没考虑这个异常处理。

#15


OK了,我改好了,现在正常了.

多循环了一次,空循环了一次。

for i:=0 to strs.Count-1 do   改为 for i:=0 to strs.Count-2 do 

OK啦~~~~~~

谢谢各位~~~~~~太感谢了。

#16


不好意思,看来作为女性在编程方面的确有待加强。谢谢各位帮助,还好自己也动了一下小脑。呵~~~~~~~~