誰か教えてください

解決


初心者のミカコ  2002-10-04 02:19:16  No: 1644

誰か教えてください。初心者のミカコです。

以下のデータがファイル名:TEST.TXTに存在しており、
これをcomp{までを読み飛ばし、
    C43 [1R0EC50     ]={C352  ,T, 142.240,  63.500, 180.0};以下の行から
    D6  [1SS319      ]={D50   ,T, 170.815,  73.660, 180.0};までを
変数t1   t2             t3    t4     t5       t6      t7   に
それぞれ,格納して(スペース部分は格納しない)
新たなファイル名:TEST2.TXTにt1,t2,t3,t4,t5,t6,t7の順で書き込んで
ファイルを閉じたいのですが、1行ずつ読み込んで、各変数へ分解して格納する
コードが思いつかず困っています。
サンプルソースコードを教えてください。お願い致します。

/*
*  << LIST >>  Mon Jul  2 09:48:27 2001
*/
$NET_LIST [ MM ] {
  comp {
  C43 [1R0EC50     ]={C352  ,T, 142.240,  63.500, 180.0};
  D13 [1SS319      ]={D50   ,T, 171.450,  90.805, 270.0};
  D5  [1SS319      ]={D50   ,T, 156.210,  78.740, 180.0};
  D4  [1SS319      ]={D50   ,T, 156.210,  72.390, 180.0};
  D6  [1SS319      ]={D50   ,T, 170.815,  73.660, 180.0};
                                  :
                                  :(↓続きます)
  }
  nets {
  S00001={BR16- 10,U30 - 96};
  S00002={C86 -  1,R180-  1};
  S00003={U10 -825,U8  -  5};
  S00004={R57 -  2,R56 -  1,U12 -  7};
  VCC001={U10 -  2,U28 -  5,
    U7  - 12,U9  -123};
  S00005={U10 -797,U8  -  4};
  S00006={U10 -796,U13 -  5};
  }
}


にしの  2002-10-04 02:52:48  No: 1645

単純に考えるならば、区切り文字を見つけてそこまでの値を使う、ですね。
あまり綺麗なソースではありませんが、「各変数へ分解して格納する」プロシージャです。
速度面を考えるならば、もう少し違う手法を取る必要があると思います。
1行ずつ読みとるのは、TStringList.LoadFromFileなどで対処出来ます。

procedure SplitLine(Text: String; var t1,t2,t3,t4,t5,t6,t7: string);
var
  i: integer;
begin
  i := Pos('[', Text);
  t1 := Trim(Copy(Text, 1, i - 1));
  Text := Copy(Text, i+1, Length(Text));
  i := Pos(']', Text);
  t2 := Trim(Copy(Text, 1, i - 1));
  i := Pos('{', Text);
  Text := Copy(Text, i+1, Length(Text));
  i := Pos(',', Text);
  t3 := Trim(Copy(Text, 1, i - 1));
  Text := Copy(Text, i+1, Length(Text));
  i := Pos(',', Text);
  t4 := Trim(Copy(Text, 1, i - 1));
  Text := Copy(Text, i+1, Length(Text));
  i := Pos(',', Text);
  t5 := Trim(Copy(Text, 1, i - 1));
  Text := Copy(Text, i+1, Length(Text));
  i := Pos(',', Text);
  t6 := Trim(Copy(Text, 1, i - 1));
  Text := Copy(Text, i+1, Length(Text));
  i := Pos('}', Text);
  t7 := Trim(Copy(Text, 1, i - 1));
end;


初心者のミカコ  2002-10-04 03:13:20  No: 1646

1行ずつ読みとるのは、TStringList.LoadFromFileの使い方を
簡素に教えていただきたいのと
Trim();の部分が良くわからないのですが、
超初心者でゴメンナサイね。
宜しくお願い致します。


初心者のミカコ  2002-10-04 03:13:23  No: 1647

1行ずつ読みとるのは、TStringList.LoadFromFileの使い方を
簡素に教えていただきたいのと
Trim();の部分が良くわからないのですが、
超初心者でゴメンナサイね。
宜しくお願い致します。


初心者のミカコ  2002-10-04 03:28:28  No: 1648

1行ずつ読みとるのは、TStringList.LoadFromFileの使い方を
簡素に教えていただきたいのと
Trim();の部分が良くわからないのですが、
超初心者でゴメンナサイね。
宜しくお願い致します。


にしの  2002-10-04 05:46:08  No: 1649

まずはヘルプをみてください。
その上で、どういうところがどうわからないか書いてください。
TStringList.LoadFromFileの例も、ヘルプに出ています。
Trimの説明は、ヘルプに書いてあること以上に簡素にお教えできません。
# それほどに単純です


たかみちえ  URL  2002-10-04 07:22:02  No: 1650

ちょっととげになってしまい申し訳ないですけど、
超初心者といいますけど、初心者だからと逃げないでください。
まず、自分自身で調べられるのなら、できる限り自分で調べることです。
  最低でもソフトのヘルプ。開発言語などなら解説サイトもたくさんあるので、
支障がないのなら検索サイトなどで、簡単に(できればいろいろ試すに越したことはありませんけど)探したりはしましょう。

  さらにDelphiには、知りたい単語の上にキャレットを置いて、F1キーを押すことでその関数などについてのページを開く、
ワンキーヘルプ機能(HSPではそういわれてますけど(^^ゞ)があるんですから、
まずそれを利用しましょう。

  掲示板で聞くと、それにレスがつくまで進めません。
そんなのは時間の無駄ですから、掲示板で聞くのは最低限にしたほうがいいと思います。
(もちろん、ずーっと探し回るのも同じくらい時間の無駄になりえるので、
  適度にあきらめるのも大事でしょうけど)

  プログラミングというのは、自分で考えてやらないといけないことですから、
真の労働をめんどくさがらず、がんばってください。

  ちなみにもうある程度わかるかもしれませんけど、
関数の名前などは英語がもとになっているのがほとんどです。
  もともと英語圏で生まれたものなので当たり前ですけど、
それだけでもどういう風に使うものかわかることがあるので、そう覚えておくといいと思います。


Taku  2002-10-05 00:42:41  No: 1651

「1行ずつ読みとるのは、TStringList.LoadFromFileなどで対処出来ます」
と有りますが
LoadFromFileはファイル全体を読込む為、行単位では読込めないと思うのですが
そう言う意味では無いのでしょうか?

それと、便乗して申し訳ないのですが
LoadFromFileで大きなファイルの読込み途中に、中止する方法は有るのでしょうか
(今は、中止が予想される場合、ループとReadlnを使ってKeyPressがあった時点で中止。と言う方法を取っています)


にしの  2002-10-05 01:14:39  No: 1652

ファイルを閉じるまで各行を処理するのであれば、LoadFromFileが楽、ということでした。
言葉が足らずすみません。

確かに、たくさんの処理をするときに中断したい、というのであれば、Readlnで1行ずつ読みとるしかないです。
何かしらの例外を発生させれば、中断するかもしれませんが、試していません。


Taku  2002-10-05 07:45:13  No: 1653

にしのさま  有難うございます
やはり、中断は無理ですね。あえて例外を発生させるのは、どうかと思いますので
現行のままで行きます

ミカコさま、便乗して申し訳ありませんでした
まだ、解決していないようなので一番単純な方法を追記しておきます

var F:TextFile;
    S:string;
    t1,t2,t3,t4,t5,t6,t7:string  
begin
      AssignFile(FLoad, 'TEST.TXT');    
      Reset(FLoad);
      AssignFile(FSave, 'TEST2.TXT');
      Rewrite(FSave);
      while not eof(FLoad) do
          begin
                Readln(FLoad, S);
                if {S=条件}  then    
                begin
                    SplitLine(S);//にしのさんのプロシージャ                
                    Writeln(FSave,t1);
                          ”
                    Writeln(FSave,t7);
                end;
         end;
        CloseFile(FLoad);
        CloseFile(FSave);
end;
{S=条件}の所は Copy(S,1,1)='D'とか、内容に合う条件で考えて下さい  
書き込みの所はWriteln(FSave,t1+','+  〜  +t7)かもしれません


初心者のミカコ  2002-10-07 17:29:54  No: 1654

遅くなり申し訳御座いません。問題解決し、プログラミングできました。
たかみちえさんには、誤解を招いてすいません。
また、にしのさま、Takuさまには適切なアドバイス有り難う御座いました。
今後も、いくつもコーティングして経験をつもうと考えています。
それでは、また質問させていただくことがあるかもしれませんが、
その時は宜しくお願い致します。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加