0

温度値を置き換えたいテキスト ファイルがあります。この番号の位置はテキスト内でランダムで、次のようになります。

'xdd "D:\Data\Ioana\DH1_Short_slow\DH1_360_2.xye" xye_format local !Temperature 360

... (その他のテキスト)

prm    bnonh360  1.66237`_0.41541
prm bh360 = 1.2 * bnonh360;
site Na1 x ref_flag -0.11868`_0.00258 y ref_flag  0.51229`_0.00446 z ref_flag  0.00330`_0.00107 occ Na 1 beq = bnonh360;

...(その他のテキスト)

Out_CIF_STR_Uiso("D:\Data\Ioana\DH1_Short_slow\DH1_360.cif")
Out_Profile("D:\Data\Ioana\DH1_Short_slow\DH1_360_plot.pro")
Out_Tick("D:\Data\Ioana\DH1_Short_slow\DH1_360_plot.tic") '

テキストが多いということは、ファイル内のテキストが多いことを意味します。たとえば、360 を 365 に置き換えたいとします。

私は次のようなことを試しました

   do
     read(10,'(a)',iostat=iok) line1
     found = ( (index(line1,'360') /=0) )
     if (found) then
       write(*,*) '365'
      endif 
     if(line1 == '$') exit
     write(*,*) line1
     write(40,*,iostat=iok) line1
  enddo

しかし、これは 360 が見つかった次の行に 365 を書き込むだけです。

ありがとう

4

1 に答える 1

-1

インデックス組み込みの戻り値で貴重な情報を破棄しています。同じ長さの「360」を「365」に置き換えるには、次のようにします。

pos=index(line1,'360')
if(pos>0)   line1(pos:pos+2)='365'

または一般に、文字列行で部分文字列 s1 の最初の出現を s2 に置き換えたい場合、s1 と s2 はおそらく異なる長さであり、置換に含めたくない不特定の数のスペースで埋められます。 、 あなたがやる

pos=index(line,trim(s1))
if(pos>0)  line=line(1:pos-1)//trim(s2)//line(pos+len_trim(s1):len_trim(line))

置換にパディング スペースを含めたい場合は、RHS 部分文字列の位置オフセットを変更できます。すべてのオカレンスに対して置換を実行する場合は、これを while ループで囲むことができます

これはもちろん、行の宣言された長さが新しい文字列を保持するのに十分な長さであるという前提の下にあります。ただし、FORTRAN77 では自己代入が禁止されているため、それを使用している場合は、結果を格納するために別の文字列変数が必要になることに注意してください。

于 2013-11-25T16:56:24.513 に答える