全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1234
推到 Plurk!
推到 Facebook!

关于文本文档与table

尚未結案
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-02-23 16:30:30 IP:218.19.xxx.xxx 未訂閱
请教各位前辈: 怎样将一个txt文本文档里面的data读到一个table中,比如这样的情况: 1.a.txt ABCDE ABCDE 5 ABCD ABCD 3 A.BCDEFG A.BCDEFG 8 ABCDEF ABCDEF 10 2.table1 field1 field2 field3 3.希望的结果: table1 field1 field2 field3 ABCDE ABCDE 5 ABCD ABCD 3 A.BCDEFG A.BCDEFG 8 ABCDEF ABCDEF 10 期待你的指教,急。。。。。谢谢!
meta
中階會員


發表:3
回覆:60
積分:57
註冊:2004-06-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-02-23 19:23:32 IP:202.39.xxx.xxx 未訂閱
//try try..D7下ok!
procedure TForm1.Button2Click(Sender: TObject);
var
  i:Integer;
  sl:TStringList;
begin
  sl:=TStringList.Create;
  try
    sl.LoadFromFile('C:\a.txt');
    sl.CommaText:=sl.Text;
    memo1.Lines.Assign(sl);
    for i:=0 to memo1.Lines.Count-1 do
      if i mod 3=0 then
        AddDB(memo1.Lines[i],memo1.Lines[i十1],memo1.Lines[i十2]);
  finally
    sl.Free;
  end;
end;    procedure TForm1.AddDB(field1,field2,field3:String);
begin
  try
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('insert into table1');
    ADOQuery1.SQL.Add('values(:field1,:field2,:field3)');
    ADOQuery1.Parameters.ParamByName('value1').Value:=field1;
    ADOQuery1.Parameters.ParamByName('value2').Value:=field2;
    ADOQuery1.Parameters.ParamByName('value3').Value:=field3;
    ADoQuery1.ExecSQL;
  except
    showmessage(AddDb error);
  end;
end;
//可以參考站內CommaText、Insert(sql)相關文章 '十'符號怪怪.. //多多指教..多多指教..
yorkland
高階會員


發表:2
回覆:138
積分:108
註冊:2004-12-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-23 20:16:22 IP:203.67.xxx.xxx 未訂閱
如果是文字檔, 一般會以固定欄寬來存放資料。 然後以TStringlist.Loadfromfile載入, 然後寫程式依指定的起迄Bytes數去讀取資料, 但你的例子似乎是以空白鍵當分隔符號。 那就只好寫程式, 去讀取空白的位置, 然後一個一個分解後再存入Table中。
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-24 09:22:35 IP:218.19.xxx.xxx 未訂閱
hi,yorkland 在我的例子中,文本文档的所有数据是以一个tab键来作为分隔符的,不是用空格键,请指教!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-02-24 10:54:29 IP:210.65.xxx.xxx 未訂閱
Hi liangzai,
procedure TForm1.Button1Click(Sender: TObject);
var
  ST1,ST2 : TStrings;
  I,J : Integer;
begin
  ST1 := TStringList.Create;
  ST2 := TStringList.Create;
  ST1.LoadFromFile('C:\Test.txt');
  for I := 0 to ST1.Count - 1 do
    begin
      ST2.Delimiter := #9; // TAB 鍵
      ST2.DelimitedText := ST1[I];
      with ClientDataSet1 do
        begin
          Append;
          for J := 0 to FieldCount - 1 do
            begin
              try
                Fields.Fields[J].AsSTring := ST2[J];
              except
                Fields.Fields[J].AsSTring := '';
              end;
            end;
          PoST
        end;
    end;
  ST2.Free;
  ST1.Free;
end;
發表人 -
------
Fishman
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-25 09:14:14 IP:218.19.xxx.xxx 未訂閱
hi,fishman: 谢谢你的指教!我把第二个for语句的fieldcount-1改成st2[J]-1才能正常使用。不知道为什么? 另外就是,我用普通的bde里面的Ttable,Tclientdataset,Tquery可以成功,但是由于我现在使用的table是oracle里面的table,利用dbexpress里面的TSQLtable,TSQLquery进行访问oracle,达到将文本文档数据加入到table里面的目的,却不能成功?请指教,谢谢
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-25 09:41:26 IP:210.65.xxx.xxx 未訂閱
Hi liangzai,    1.ST2[J] 型態為 String 如何進行 ST2[J] - 1 的運算?    2.以下為 TSQLTable 的 Help,看了應該就有答案了    TSQLTable represents a database table that is accessed using dbExpress.    Unit    SqlExpr    Description    Use TSQLTable to represent a table on a database server that is accessed via TSQLConnection.  TSQLTable generates a query to fetch all of the rows and columns in a table you specify. You can add a TSQLTable component to a form or data module at design time, or create one dynamically at runtime.    TSQLTable is a unidirectional dataset. Unlike other datasets, unidirectional datasets do not buffer multiple records in memory. Because of this, you can only navigate using the First and Next methods. There is no built-in editing support: you can only edit the data in an SQL table by explicitly creating an SQL UPDATE command or by connecting the table to a client dataset using a provider. Features that require buffering multiple records, such as filters or lookup fields, are not available. Before you can use a TSQLTable component, it must be connected to the database server. Therefore, the first step to take when working with TSQLTable is to set the SQLConnection property. Once the dataset is connected to a server, use the TableName property to specify the table this component represents. ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-02-25 10:31:23 IP:218.19.xxx.xxx 未訂閱
procedure TForm1.BitBtn1Click(Sender: TObject); var   ST1,ST2 : TStringlist;   I,J : Integer; begin   ST1:=TStringList.Create;   ST2:=TStringList.Create;   ST1.LoadFromFile('C:\1.txt');   for I:=0 to ST1.Count-1 do     begin       self.Memo1.Lines.Add(ST1[I]);       ST2.Delimiter:=#9; // TAB 鍵       ST2.DelimitedText:=ST1[I];       for J:=0 to st2.Count-1 do       self.Memo2.Lines.Add(ST2[J]);       with self.ClientDataSet1 do         begin          Active:=true;          Append;           for J:=0 to st2.Count-1 do            begin               try                 Fields.Fields[J].AsSTring:=ST2[J];               except                 Fields.Fields[J].AsSTring:='';               end;             end;           post;         end; end;   ST2.Free;   ST1.Free;    end;    end.
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-02-25 10:34:19 IP:218.19.xxx.xxx 未訂閱
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-25 10:41:21 IP:218.19.xxx.xxx 未訂閱
出现以下错误: project project1.exe raised exception class EDatabaseError with message'ORA-12154:TNS:无法处理服务名'
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-02-25 11:10:31 IP:210.65.xxx.xxx 未訂閱
Hi liangzai,
1.
ClientDataSet 未事先定義欄位,所以 FieldCount 為 0,可先行定義好或是改用你的寫法    2.
我用 SQLTable 一直有問題,因此改用 SQL Query 已成功寫入 Oracle,但是必須加入 ClientDataSet1..ApplyUpdates(-1); 進行批次更新
procedure TForm1.Button1Click(Sender: TObject);
var
  ST1,ST2 : TStrings;
  I,J : Integer;
begin
  ST1 := TStringList.Create;
  ST2 := TStringList.Create;
  ST1.LoadFromFile('C:\Test.txt');
  for I := 0 to ST1.Count - 1 do
    begin
      ST2.Delimiter := #9; // TAB 鍵
      ST2.DelimitedText := ST1[I];
      with ClientDataSet1 do
        begin
          Append;
          for J := 0 to FieldCount - 1 do
            begin
              try
                Fields.Fields[J].AsString := ST2[J];
              except
                Fields.Fields[J].AsString := '';
              end;
            end;
          Post;
        end;
    end;
  ClientDataSet1.ApplyUpdates(-1);
  ST2.Free;
  ST1.Free;
end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-02-25 13:49:31 IP:218.19.xxx.xxx 未訂閱
hi,fishman: 真是不好意思,打扰你了! 请问用sqlquery怎样将数据写入oracle里面的table?只能使用update语句吗? 能不能告诉我具体的code? sqlconnection1---sqlquery1--datasetprovider1--clientdataset1 是这样的访问顺序? 初次使用oracle作为数据库,所以很多地方都不懂,还请多指教,谢谢你了!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-02-25 14:31:55 IP:210.65.xxx.xxx 未訂閱
Hi liangzai,    其實不管是 Oracle 或是 SQL Server 原理都是一樣的    TSQLConnection(OracleConnection) --> TSQLTable(tablename)/TSQLQuery(select * from tablename) --> TDataSetPrvider --> TClientDataSet    在對 ClientDataSet 進行 Append 與 Post、最後再 ApplyUpdate 進入資料庫     ---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-03-01 16:13:22 IP:218.19.xxx.xxx 未訂閱
hi,fishman 我使用你给我的方法加入数据到oracle中去,当一条记录中的某一个field中的值包含空格时, 比如说 1 2 3 4 5 6 081566 Ito Kenyu 李小明 sdk Business Management 在第6个field中的值存在空格,就会出现错误,因为不存在第7个field,请问怎么解决这个空格的问题,谢谢!
Fishman
尊榮會員


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-03-02 08:35:37 IP:210.65.xxx.xxx 未訂閱
Hi liangzai,
這就是為何我會用 
          for J := 0 to FieldCount - 1 do
            begin
              try
                Fields.Fields[J].AsString := ST2[J];
              except
                Fields.Fields[J].AsString := '';
              end;
            end;    你也可以改成這樣
for J:=0 to st2.Count-1 do
  begin
    try
      Fields.Fields[J].AsString:=ST2[J];
  except
  end;
---------------------------------- 小弟才疏學淺,若有謬誤尚請不吝指教 ----------------------------------
------
Fishman
liangzai
初階會員


發表:77
回覆:91
積分:33
註冊:2004-08-13

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-03-02 09:33:16 IP:218.19.xxx.xxx 未訂閱
hi,fishman 但是现在的情况是这样的: 我使用fields.count-1的话,就会出现错误:“......EstringlistError with message"list index out of bounds(1)....." 如果我使用ST2.count-1的话,不会出现错误,但是加入到table中的数据是问号? 如果我把txt文档中存在空格的值去掉空格,那么可以正常加入到table中,但是多了将空格去掉这一个过程。 请问怎么回事?
系統時間:2024-05-20 2:32:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!