アプリ版:「スタンプのみでお礼する」機能のリリースについて

タイトルの通りです.
現在カンマで区切られた6個の項目が並んでいる,120万行ほどあるデータの処理をしています.
そのうち1つのデータの数値をソートして別ファイルにする作業をしたいのですが,
具体的には,全文を読みながらデータ値域が0~80の数値項目をif文で5刻みに(0-5,5-10,...)検索し,該当する行番号を抽出し,別ファイルに抽出した行番号の行内容だけを出力します.
その際に,1行に含まれる該当データは普通に読み込めるのですが,項目の中の1つにIDがあり,通し番号になっているのですが,IDが1から999までは読めるのですが,1000から1,000のように区切りが入っており,そこで分断されてしまいます.
Excelで区切り位置でデータを修正してから再度プログラムにかけられればいいのですが,120万行ありExcelは100万行ちょっとしか処理できないため,質問しております.
画像にデータの冒頭部分を載せております.ソートしたいのはgrid_codeと書いてある値です.
画像中ではID,FIDと書いてある2項目が数値によってはカンマが入っています.
それから,' " 'が含まれる数値は読み込めますか?
ID,FIDの文字数が固定ならカンマ込みで読み込んであとからその文字数分で結合すれば問題ないのですが,
1,000の次に1,000,000もあるのでお手上げ状態です(笑

「Fortran カンマを含む数値データの」の質問画像

A 回答 (2件)

とりあえず FID_keisha を整数として求められれば、後は自力で何とかなるんだろ?


それほど難しい問題ではない。

自由書式で読めば、CSVデータの読み取りはできる。引用符でくくられている部分は文字列として読み込める。このとき、読み取ったデータから引用符は落ちる。次にコンマを抜き去るのだが、これは配列に対するPACK関数でフィルタリングすればよい。だが、そのためにはまず文字列を1文字ごとの文字配列に変換するする必要がある。これはTRANSFER関数で出来る。なおフィルタリングした後、文字配列を文字列に戻しておく。最後に文字列を整数に変換するのだが、これは内部ファイルを使うのが定石。文字列を入力ファイルのようにみなして、整数変数に書式付で読み込む。

参考プログラムを書いておく。
program goo
implicit none
integer, parameter :: nmax = 10**1
integer :: i, m, io, id(nmax), point_id(nmax), fid_keisha(nmax)
real(kind = 8) :: grid_code(nmax)
character(len = 1) :: fkind(nmax)
character(len = 20) :: cid_1976(nmax), cid_keisha(nmax), buf
character :: tmp(20)
!
read(10, *)
do i = 1, nmax
read(10, *, iostat = io) id(i), cid_1976(i), fkind(i), cid_keisha(i), point_id(i), grid_code(i)
if (io == -1) exit
end do
m = i - 1

do i = 1, m
tmp = transfer(cid_keisha(i), ' ', size = 20) ! string to character array
buf = transfer(pack(tmp, tmp /= ','), buf) ! filter out comma then cha-array to string
read(buf, '(i20)') fid_keisha(i) ! read from internal file (string)
end do
print *, fid_keisha(:m)
end program goo

出力例
sh-4.3$ main
1211043 1211036 1211037

データファイル fort.10
FIDm,FID_1976,�y�n���p��,FID_keisha,POINTID,GRID_CODE
0,"835,007",F,"1,211,043",0,0.182313430000000
1,"835,004",F,"1,211,036",0,5.945347790000000
2,"835,005",E,"1,211,037",0,5.004501340000000
    • good
    • 0
この回答へのお礼

ありがとうございました!!
回答を参考にサブルーチンとPACK関数を組み合わせてなんとか目的の処理ができました!!

お礼日時:2016/01/08 17:00

なぜに Fortran 限定?

    • good
    • 0
この回答へのお礼

今大学で修士論文を書いておりまして,普段使っているプログラムがfortranだからです.
新しいプログラムに取りかかっている時間もなく..って感じです.

お礼日時:2016/01/08 07:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!