誰か教えてください。初心者のミカコです。
以下のデータがファイル名: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};
}
}
単純に考えるならば、区切り文字を見つけてそこまでの値を使う、ですね。
あまり綺麗なソースではありませんが、「各変数へ分解して格納する」プロシージャです。
速度面を考えるならば、もう少し違う手法を取る必要があると思います。
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;
1行ずつ読みとるのは、TStringList.LoadFromFileの使い方を
簡素に教えていただきたいのと
Trim();の部分が良くわからないのですが、
超初心者でゴメンナサイね。
宜しくお願い致します。
1行ずつ読みとるのは、TStringList.LoadFromFileの使い方を
簡素に教えていただきたいのと
Trim();の部分が良くわからないのですが、
超初心者でゴメンナサイね。
宜しくお願い致します。
1行ずつ読みとるのは、TStringList.LoadFromFileの使い方を
簡素に教えていただきたいのと
Trim();の部分が良くわからないのですが、
超初心者でゴメンナサイね。
宜しくお願い致します。
まずはヘルプをみてください。
その上で、どういうところがどうわからないか書いてください。
TStringList.LoadFromFileの例も、ヘルプに出ています。
Trimの説明は、ヘルプに書いてあること以上に簡素にお教えできません。
# それほどに単純です
ちょっととげになってしまい申し訳ないですけど、
超初心者といいますけど、初心者だからと逃げないでください。
まず、自分自身で調べられるのなら、できる限り自分で調べることです。
最低でもソフトのヘルプ。開発言語などなら解説サイトもたくさんあるので、
支障がないのなら検索サイトなどで、簡単に(できればいろいろ試すに越したことはありませんけど)探したりはしましょう。
さらにDelphiには、知りたい単語の上にキャレットを置いて、F1キーを押すことでその関数などについてのページを開く、
ワンキーヘルプ機能(HSPではそういわれてますけど(^^ゞ)があるんですから、
まずそれを利用しましょう。
掲示板で聞くと、それにレスがつくまで進めません。
そんなのは時間の無駄ですから、掲示板で聞くのは最低限にしたほうがいいと思います。
(もちろん、ずーっと探し回るのも同じくらい時間の無駄になりえるので、
適度にあきらめるのも大事でしょうけど)
プログラミングというのは、自分で考えてやらないといけないことですから、
真の労働をめんどくさがらず、がんばってください。
ちなみにもうある程度わかるかもしれませんけど、
関数の名前などは英語がもとになっているのがほとんどです。
もともと英語圏で生まれたものなので当たり前ですけど、
それだけでもどういう風に使うものかわかることがあるので、そう覚えておくといいと思います。
「1行ずつ読みとるのは、TStringList.LoadFromFileなどで対処出来ます」
と有りますが
LoadFromFileはファイル全体を読込む為、行単位では読込めないと思うのですが
そう言う意味では無いのでしょうか?
それと、便乗して申し訳ないのですが
LoadFromFileで大きなファイルの読込み途中に、中止する方法は有るのでしょうか
(今は、中止が予想される場合、ループとReadlnを使ってKeyPressがあった時点で中止。と言う方法を取っています)
ファイルを閉じるまで各行を処理するのであれば、LoadFromFileが楽、ということでした。
言葉が足らずすみません。
確かに、たくさんの処理をするときに中断したい、というのであれば、Readlnで1行ずつ読みとるしかないです。
何かしらの例外を発生させれば、中断するかもしれませんが、試していません。
にしのさま 有難うございます
やはり、中断は無理ですね。あえて例外を発生させるのは、どうかと思いますので
現行のままで行きます
ミカコさま、便乗して申し訳ありませんでした
まだ、解決していないようなので一番単純な方法を追記しておきます
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)かもしれません
遅くなり申し訳御座いません。問題解決し、プログラミングできました。
たかみちえさんには、誤解を招いてすいません。
また、にしのさま、Takuさまには適切なアドバイス有り難う御座いました。
今後も、いくつもコーティングして経験をつもうと考えています。
それでは、また質問させていただくことがあるかもしれませんが、
その時は宜しくお願い致します。