Q&A

  • 대량 텍스트파일 읽어서 테이블에 입력할려구 하는데여....
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i:integer;
fname:string;
h:Textfile;
ps:byte;
a,b:string;
iPos,j:integer;
Fld:array[0..17] of string;
begin
for i:=0 to lb_file.Items.count-1 do
begin
  fname:= DirectoryListBox1.Directory+''+lb_file.items.Strings[i];
  //showmessage(fname);
//  CreateAWSinsert(fname);
  if FileExists(fname) then
    begin
       assignfile(h,fname);
       reset(h);
       readln(h,a);
       while not Eof(h) do
        begin
          iPos := Pos('#',a);
          if iPos <> 0 then           //"|"이 있는 라인 쯕 실제 레코드를 찾아서 들어간다.
          begin
             j:=0;
             while (a<>'=') and (length(a)>0) do
             begin
               if (length(a) =0) then   //"="이라는 문자를 만나야지만..1개의 레코드 끝이다.
               begin
                readln(h,b);
                j:=0;
                a := a + b;
               end else
                   begin
                    ps:=pos('#',a);
                    fld[j]:=copy(a,1,ps-1);  //여기서 데이터를 처리하던가 아님 배열등으로...
                    a:=copy(a,ps+1,length(a));
                    j:=j+1;
                   end;
             end;
          //showmessage('data input');
          //테이블에 입력
          Query1.Close;
          Query1.SQL.Clear;
          Query1.SQL.ADD('select * from aws_min');
          Query1.SQL.ADD('where stn_id=fld[0] and tm_fc=fld[1]');
          Query1.Open;
          showmessage('aaa');
          if Query1.RecordCount<>0 then
          begin
            showmessage('update');
            with Query1 do
            begin
              close;
              DatabaseName:='weather';
              SQL.Clear;
              SQL.Add('Update aws_min');
              SQL.Add('Set stn_id=fld[0]');
              SQL.Add('Set tm_fc=fld[1]');
              SQL.Add('Set ft_lat=fld[2]');
              SQL.Add('Set ft_lon=fld[3]');
              SQL.Add('Set ft_hig=fld[4]');
              SQL.Add('Set wd=fld[5]');
              SQL.Add('Set ws=fld[6]');
              SQL.Add('Set ta=fld[7]');
              SQL.Add('Set rn=fld[8]');
              SQL.Add('Set st1=fld[9]');
              SQL.Add('Set st2=fld[10]');
              SQL.Add('Set cc=fld[11]');
              SQL.Add('Set hc=fld[12]');
              SQL.Add('Set dc=fld[13]');
              SQL.Add('Set bc15=fld[14]');
              SQL.Add('Set bc60=fld[15]');
              SQL.Add('Set wtd=fld[16]');
              SQL.Add('Set wts=fld[17]');
              SQL.Add('Where stn_id=fld[0] and tm_fc=fld[1]');

              //if Prepared = false then Prepare;
              ExecSQL;
            end;
           end
           else
            begin
              with Query1 do
              begin
              showmessage('Insert');
              close;
              DatabaseName:='weather';
              SQL.Clear;
              SQL.Add('Insert Into aws_min');
              SQL.Add('(stn_id,tm_fc,ft_lat,ft_lon,ft_hig,wd,ws,ta,rn,st1,st2,cc,hc,dc,bc15,bc60,wtd,wts) Values');
              SQL.Add('(fld[0],fld[1],fld[2],fld[3],fld[4],fld[5],fld[6],fld[7],fld[8],fld[9],fld[10],fld[11],fld[12],fld[13],fld[14],fld[15],fld[16],fld[17])');
              //if Prepared = false then Prepare;
              ExecSQL;
              end;
             end;
            end;
          end;
          readln(h,a);
        end;
       closefile(h);
end;
end;

======================================================================
입력이나 수정 루틴을 만나면 에러가 나네여..
고수님들 좀 봐주세여....ㅠㅠ
3  COMMENTS
  • Profile
    이미진 2002.02.04 23:44
    BatchMove Component를 사용해 보세여...
    스키마파일을 만들어 사용하면 간단히 해결됩니다.

  • Profile
    송영석 2002.02.03 12:58


    위의 질문에 답변의 다른 답변이 있으므로 할 필요는 없겠구여.. 만약 대량의 텍스트 파일의 테이블에 삽입하면 엄청난 시간이 소요된다는 문제점이 있습니다. 이점은 생각해 보셨습니까?

    제 경우에는 약 1000만건 정도의 데이터를 테이블에 삽입을 해 봤는데 몇시간 돌리다 포기했습니다. 결국 코딩상으로는 문제가 있다는 거죠.. ^^;; 물론 괜한 얘기일수도 있습니다만... 만약 MS-SQL을 사용하신다면 Bulk Insert 같은 것을 함 사용해 보십시요.. ^^

    빠른 속도에 반하실겁니다.
  • Profile
    버섯 2002.01.30 00:25
    아래처럼 하십시오..

    sqltxt := 'Update tablename set field01=:field01,field02=:field02 ....
        + ' where fieldxx = :fieldxx';

    qq.sql.clear;
    qq.sql.add(sqltxt);
    qq.parambyname('field01').asstring := arr[01];
    qq.parambyname('field02').asstring := arr[02];
    qq.parambyname('field03').asstring := arr[03];
    ...
    ...
    ..
    qq.execsql;

    asString <-- 이놈은 데이터베이스 테이블 스키마에 있는 형과 같아야 합니다.

    ' <-- 싱글쿼테이션.. 이놈은 스트링 상수를나타낼때 씁니다.

    'arr[01]' <-- 이렇게 하면.. 변수 arr[01] 이 아니고.. 상수입니다..


    만약에 쿼테이션을 하고싶으면.. '''' + arr[01] + '''' 라고 표현해야 합니다.

    초보자에게는 너무 헷갈리므로.. quot(arr[01])하시믄 됩니다.
    물론 quot 라는 펑션을 맹글어야 하겠죠..

    function quot(ss : string);
    begin
         quot := '''' + ss + '''';
    end;

    이렇게요...

    열심히 공부하세여.... 즐코..
    • 최수림
    • 2002.01.30 02:14
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 김양훈
    • 2002.01.30 02:03
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 유진
    • 2002.01.30 01:14
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 빙고
    • 2002.01.30 00:48
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 최용일
      2002.01.30 01:40
      안녕하세요. 최용일입니다. 자료실에 보시면 GraphicEx란 그래픽관련 패키지가 있습니다. 그걸 설치하시...
    • 빙고
      2002.01.30 18:09
      정말 감사합니다. 막막했었는데.. 지금 당장 업체가서 해봐야겠네여.. 다시 한번 감사드립니다..
    • 정민주
    • 2002.01.30 00:32
    • 0 COMMENTS
    • /
    • 0 LIKES
    • 오진욱
    • 2002.01.30 00:25
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 배건환
      2002.01.30 03:10
      procedure TForm1.ListBox1Click(Sender: TObject); begin   Edit1.Text := ListBox1.item...
    • 버섯
      2002.01.30 00:29
      showMessage(Listbox1.items[Listbox1.itemIndex]); 하시믄 됩니다...
    • 조성필
    • 2002.01.29 23:43
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 조성필
      2002.01.29 23:46
      자문자답..ㅡ.ㅡ;; 방금 올리고 제가 바로 답글을 달다니...ㅡ.ㅡ;;;; sqlclientdataset.recno+1; 요렇...
    • 최은규
      2002.02.04 19:45
      uid int(11) not null auto_increment primary key default 1 이라고 디폴트값을 지정해주셔도 됩니다... ...
    • 김재환
    • 2002.01.29 23:37
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 윤창준
      2002.01.29 23:52
      안녕하세요. 검색해 보시면 답이 있을 텐데. 답변을 기다리지 않아도 되고요 ^^; a := 0.12345678; t...
    • 김기환
    • 2002.01.29 23:21
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 이미진
      2002.02.04 23:44
      BatchMove Component를 사용해 보세여... 스키마파일을 만들어 사용하면 간단히 해결됩니다.
    • 송영석
      2002.02.03 12:58
      위의 질문에 답변의 다른 답변이 있으므로 할 필요는 없겠구여.. 만약 대량의 텍스트 파일의 테이블에 ...
    • 버섯
      2002.01.30 00:25
      아래처럼 하십시오.. sqltxt := 'Update tablename set field01=:field01,field02=:field02 ....  ...
    • 보들레르
      2002.01.29 23:21
      그런곳은 본적이 없구요.. 이곳 한델이나 델마당 델코등에 강의실과 팁란을 두루두루 살펴보시며 공...
    • BlueSea
    • 2002.01.29 21:50
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 보들레르
      2002.01.29 23:20
      FTP 서버에서 anonymous 계정을 지원하면 가능하겠지요.. 그렇지 않다면 매일 변경되는 비밀번호를 확인...
    • 김재환
    • 2002.01.29 21:48
    • 2 COMMENTS
    • /
    • 0 LIKES
    • 보들레르
      2002.01.29 23:18
      var   Sg : Single; begin   Sg := 123.12345;   ShowMessage(FormatFl...
    • 김재환
      2002.01.29 22:21
      floattostr...인것 같아요!!   ^^! 행복하세요..
    • BlueSea
    • 2002.01.29 21:27
    • 1 COMMENTS
    • /
    • 0 LIKES
    • BlueSea
      2002.01.29 21:49
      여러사이트를 뒤지다가 발견했습니다. 파일이름만 추출하는 함수가 있더군요. ExtractFileName(FileList...
    • 박일용
    • 2002.01.29 21:01
    • 3 COMMENTS
    • /
    • 0 LIKES
    • 5782_Click
      2002.01.29 21:16
      쿼리 컴포에 RequestLive란 넘이 있슴당... 그넘을 True로 해주시믄 변경된값만 디비에 저장이 댑니당....
    • 용이...
      2002.01.29 21:44
      먼전 답변에 감사 드립니다. 그런데...그게 아니라... 변경된 레코드들만 알 수 있나가 궁금한데... ...
    • 보들레르
      2002.01.29 23:25
      질문이 조금 모호하게 생각되네요..^_^; 변경을 어떻게 가하셨다는 말씀인가요? DBGrid 에서 직접 수...
    • 서진현
    • 2002.01.29 20:47
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 5782_Click
      2002.01.29 21:18
      델파이에두 insert가 있슴당.... objects.insert(5);
    • 문상준
    • 2002.01.29 20:33
    • 1 COMMENTS
    • /
    • 0 LIKES
    • 우정민
      2002.01.29 20:37
      저같으면 인스톨시가 아니고... 프로그램을 최초실행시에 해당 db가 있는지 검사해서 db를 생성한다...
    • 최용일
      2002.01.29 20:12
      안녕하세요. 최용일입니다. OnCellClick이벤트에서 Column.Title이나 Column.FieldName등을 체크하면 ...
    • 김인수
      2002.01.29 21:28
      고수님 답변 감사합니다 근대 저는 컬럼의 셀을 더블클릭했을때 윈도우창이 뜨게 하고 싶은데..... 어떻...
    • 최용일
      2002.01.29 22:22
      안녕하세요. 최용일입니다. 현재 선택된 필드하고(SelectedField) 원하는 컬럼의 필드하고 비교해보시면...
    • 김인수
      2002.01.29 23:59
      아~~ 그렇군요 이렇게 하닌깐 정말 잘되는군요 가르침주셔서 너무너무 감사합니다 그럼 건강하시구요 안...
    • 이경문
      2002.01.29 20:45
      정확한 원인인지는 모르겠지만 ccc.exe의 current directory가 어떻게 되는지 확인해 보십시오. 즉 탐색기...
    • 이기석
      2002.01.29 21:52
      죄송합니다.. 님의 말씀을 잘 이해가 되지 않습니다.. 정리하자면 .. 1. ccc.exe 를 호출하는 부모 ...
    • 윤도상
    • 2002.01.29 19:00
    • 1 COMMENTS
    • /
    • 0 LIKES
    • Mr. Ziker
      2002.01.31 11:06
      엑티브 엑스는 CAB형태로 배포되는게 일반적입니다. 그러니까 간단히 정리 하자면, 델파이에서 프로젝트...