• ベストアンサー

fortranでのcsvファイルを出力する方法

fortranでコンマ切りテキストファイル(CSVファイル)を 出力する方法をご存知の方、いらっしゃいませんでしょうか? 私が使用した処理系(intel fortran 8.0 for Windows)で write(600,*)1.4,',',2.33,',',30.11 というコードを実行させると fort.600 というファイル名のテキストファイルが生成されて 中身は ___1.400000_____,___2.330000_____,___30.11000____ となります。( _ は半角空白を意味します。) 私が欲しいのは余計な空白の入っていない 1.4,2.33,3.11 または 1.400000,2.330000,30.11000 という出力なのですが、どのような書式指定をすれば これが可能なのでしょうか? 全くのfortran初心者です。よろしくご教示ください。

  • boson
  • お礼率47% (10/21)

質問者が選んだベストアンサー

  • ベストアンサー
  • kai714
  • ベストアンサー率100% (2/2)
回答No.4

汎用的な方法は、#2さんのように文字列として書き出して、adjustlやtrimを使って空白を取るのでしょうが、Intel Fortran8.0ならば以下のようなformatでできます。 write(600,10) 1.4,',',2.33,',',30.11 10 format(f0.6,a1,f0.6,a1,f0.6) マイナス記号があっても問題ないです。書式幅が0の指定はIとFに使えます。なかなか便利ですよ。ちなみにConpaq Visual Fortranでも使えます。

boson
質問者

お礼

本来の目的だった変数の場合に適用してみましたところ x=1.4 y=2.33 z=30.11 write(600,10) x,',',y,',',z 10 format(f0.6,a1,f0.6,a1,f0.6) 以下のような出力を得ることが出来ました。 1.400000,2.330000,30.110001 どうもありがとうございました。 これで余計な処理が省けそうです。

その他の回答 (3)

回答No.3

エクセル上でコンマ区切りにできます。 エクセル上のファイルメニュー[データ]→[区切り位置]です。 データはA列を選んでください。

boson
質問者

補足

ご回答ありがとうございました。 仰る通りなのですが、処理しなくてはならないファイル数が多いので、ご指摘の手順をマクロ化して自動化しないと実用には供さない思います。 (指定されたディレクトリに生成された多数のFortran出力ファイルを自動的に読み込んではCSVに書き換えてくれるようなマクロ?) 現状ではVisualBasicで上記マクロに相当するプログラムを作り、処理しております。 このため、Fortranには出力段階でCSVにできるような機能がもともと備わっているのかどうかを伺いたかった次第です。 あと、エクセルの列数は最大256列ではなかったでしょうか? 列数が256を超えてしまうことがありますので、シートに読み込んで作業を行うことは恐らく出来ないのではないでしょうか。

  • 530529
  • ベストアンサー率16% (86/521)
回答No.2

#1です。桁数も有効数字も不明ならば、 単純にwriteで変数を出力するだけではだめかと思います。変数の値を数値では無く、文字として文字列の変換をして出力する事が必要では無いでしょうか ? ここら辺になる、私の知っている66では各社により 扱いがバラバラでした。77になって文字列が扱えるようになったと思います。私の範囲を超えてしまいました。お役に立てず申し訳ございません。

  • 530529
  • ベストアンサー率16% (86/521)
回答No.1

大昔のfortran(66)しか知らないのですが、 write(600,*)1.4,',',2.33,',',30.11 のところを write(600,1)1.4,',',2.33,',',30.11 1 format(f4.1,',',f5.2,',',f6.2) とかしたら駄目なのかしら ? ただ符号が最初に入るから、やっぱり1つスペースが 入っちゃうかな ??

boson
質問者

補足

ご回答ありがとうございます。 即値に対してはおっしゃる通りの書式指定でコンマ切りテキストになると思います。 が、実際のコードでは 1.4 2.33 30.11 の部分は変数になります。 またその変数に代入されている実際の計算結果は 0.1 だったり 0.0001 だったり、あるいは 0.123456 だったりします。 計算結果の有効数字が計算する前にあらかじめわかっていないと書式指定ではコンマ切りテキストは作れないのでしょうか?

関連するQ&A

  • CSV出力で改行がうまくできない。

    VBAでテキストファイルにCSV出力をおこなっています。 方法は、 Print #FreeFile, FreeFileOutput; でおこなっています。FreeFileOutputは変数でカンマで区切られた複数の値が はいっています。最後はカンマはありません。つまり、 "a,b,c,d" といった値がFreeFileOutputにはいっています。 これをループでまわして、複数行を出力したいとおもっています。 無事に出力はできるのですが、テキストファイルを見ると各行の終わりで改行 されていません。print関数を使い";"をつけると自動で改行が入力される みたいですがされません。どうしてでしょうか?

  • fortranで標準出力をテキストファイルとウィンドウに同時に出力する

    fortranで標準出力をテキストファイルとウィンドウに同時に出力するにはどうしたらよいのでしょうか。 初心者ですいません。 absoftのPro Fortranを使っていますが、Visual Fortranも使える環境にあります。 どうぞ宜しくお願いします。

  • 固定長からCSVへの出力時にスペースを詰めたい。

    固定長ファイルで各項目左詰めでデータ入力されておりスペースが入っております(全角、半角)。このファイルをcsv出力する際に各項目後ろの空白部分を詰めて、csv出力したいのですが可能でしょうか?

  • ExcelのCSVファイル出力について

    Excelが出力したCSVファイルを扱うプログラムに関する質問です。 Windwosの[コントロールパネル]⇒[地域と言語のオプション]で、 小数点の記号を「.(ピリオド)」から「,(カンマ)」に変更しました。 するとExcelからCSVファイルを出力したときの各データの区切り文字が 「,(カンマ)」から「;(セミコロン)」に変わるようなのですが、 これに対応できるプログラムを作りたいと考えています。 CSVファイルの区切り文字は、Windowsのロケール情報として プログラム上から取得可能なのでしょうか?

  • fortranでの出力書式設定

    ご質問させていただきます。 たとえばfortranで a=1d0,b=2d0 write(*,*)a,b と書くと数字の左側に必ず空白文字が出力させるのですが、 この空白文字をなくすことはできるのでしょうか?

  • ASPでCSVファイルのダウンロード

    ASPでオラクル上のレコードを書き出したCSVファイルをダウンロードするページを作成しました。 あるフィールドに半角カンマが入ったレコードが存在したため、その行だけ列がずれてしまいました。 そのCSVファイルはAccessで作成したプログラムで取り込みます。インポート定義で、半角カンマをフィールドの区切りに設定してあります。 Accessでの読み込みエラーを回避するために、フィールド中の半角カンマを全角カンマに置換してCSVファイルを作成したいのです。 ASP上で、Replace関数を使用してみましたが、半角カンマが引数の区切りと認識されたり、シングルクオーテーションもコメントとして認識されたりしてうまくいきません。 Response.write Replace(rs("フィールド1"),",",",") & "," & rs("フィールド2") & vbNewLine ※rsはレコードセットです。 どなたか解決方法を知っていらっしゃる方、ご教授願います。

  • FORTRANについて

    今、大学の研究室でFORTRANの勉強をしています。そこで、院生から問題を出されました。それは、 テキストファイルから数字を読み込み、それらをFORTRANの中で計算し、その答えをまたテキストファイルに出力する、というプログラムです。 計算するところまではできたのですが、どうしてもテキストファイルに出力するプログラムがわかりません。 出力の仕方だけでも教えてください。教科書にもなく、図書館でも古い時代のものばかりで。しかも、僕は学校の関係でFORTRANを全く知りません。

  • CSVファイルへの書出し方法

    テキスト文章をCSVファイルに書き出したいのですが、書き出したファイルの各行の前後にダブルコーテイション(")が付いてしまいます。 これを取り除いて書き出すことはできないのでしょうか? プログラム例: Text="abc,100,あいうえお" Open File For Append As #1 Write #1, Text Close #1 Print文では、上手くいくのは確認しています。 Write文とPrint文の処理の違いと合わせて、教えてください。

  • エクセルのカンマ区切りのCSV出力

    エクセルのカンマ区切りのCSV出力について質問します。 CSVファイルとしてカンマ区切りで出力したいのですが、さらに各項目にダブルコーテーション(")をつけて出力したいのです。 例) 通常のCSV 01,02,03 やりたいCSV出力 "01","02","03" ご存知の方がいらっしゃいましたら回答お願いします。

  • Fortranの出力の改行について

    Fortran超初心者です。 test1.csvのファイルには、x,yの変数がずっと続いています。 test2.datのファイルには、a,bの変数がずっと続いています。 この2つのファイルの変数を元に、d,eの値を求め、それをtest3.csvというファイルに出力したいのです。 test1.csvとtest2.datの計算はできていたのですが、test3.csvの出力は最後の計算結果のみしか出力されていません。 多分毎回出力はしているのですが、計算を繰り返すと上書きされ消えてしまうという仕組みになっているのだと思います。 どうやったら上書きされずに、csvファイルの次の行に次のデータを入力できますか? 以下私が考えたFortran90のプログラムです。 open (10, file='test1.csv', status='old')  do   read (10, *, iostat=ios) x, y   open (11, file='test2.dat', status='old')   do    read (11, *, iostat=jos) a, b    d = x +a    e = y + b    if (jos .lt. 0) exit   enddo   open (12, file='test3.csv', status='replace')   write (12, *) x, y, a, b, d, e   close (12)   close (11)   if (ios .lt. 0) exit  enddo close (10) 本当に始めたばかりで、いまいち意味の分かっていない部分もあるのですが、問題点を指摘してくれたら助かります。 わかりにくいので、具体的に少し書くと、 test1.csvには 1,2 9,3 6,4 とデータが続くとします。 test2.datには 80,50 10,20 90,60 とデータが続くとします。 test3.datには 1,2,80,50,81,52 1,2,10,20,11,22 1,2,90,60,91,62 9,3,80,50,89,53 9,3,10,20,19,23 9,3,90,20,99,23 6,4,80,60,86,64 6,4,10,20,16,24 6,4,90,20,96,24 と出力されるようにしたいのです。 実際のデータや変数名も違いますが、プログラムの構造は同じです。 よろしくおねがいします。

専門家に質問してみよう