Reading a two dimensional array
I'm trying to read a two dimensional array (30.7) from a external file in Fortran 90 as
READ(*,*)Fname
OPEN(UNIT=10, FILE=Fname, ACTION="READ")
DO i=1,30
READ(10,*)(indices(i,j),j=1,7)
END DO
Data has some missing values represented as blank. When I read data into array (,*)(indices(i,j))
,开发者_高级运维 it assigns 0.00
for missing data. How to over come this problem? Attaching the data below.
337.60,220.40,0.00,0.00,200.42,216.61,261.04
323.00,249.20,65.30,0.00,201.93,210.91,309.98
116.80,474.80,0.00,0.00,203.43,215.76,234.93
72.10,505.90,0.00,0.00,204.93,215.72,233.47
148.30,771.70,0.00,0.00,206.44,217.00,239.05
90.70,287.20,0.00,0.00,207.94,215.43,216.85
337.20,334.50,10.20,0.00,209.45,226.85,306.57
142.50,142.80,0.00,0.00,210.95,240.09,240.31
279.10,289.60,51.80,0.00,212.45,227.75,262.30
273.60,337.70,0.00,0.00,213.96,256.86,223.66
332.40,425.60,0.00,0.00,215.46,238.36,237.63
45.70,299.30,0.00,0.00,216.96,223.92,241.41
49.10,529.40,0.00,0.00,218.47,235.81,282.17
185.30,331.80,38.00,0.00,219.97,235.81,309.29
552.90,454.80,0.00,0.00,221.47,224.60,269.09
176.20,441.60,0.00,0.00,222.98,232.44,293.95
170.00, ,0.00, , , ,327.96
200.00, ,0.00, , , ,291.69
241.20,156.00,0.00,0.00,227.49,235.55,278.66
118.00,383.20,3.20,0.00,228.99,269.28,325.31
62.00,189.70,0.00,0.00,230.50,248.73,266.95
400.20,244.20,0.00,0.00,232.00,239.70,271.27
163.70,826.60,0.00,500.00,233.50,245.06,294.98
250.40,236.60,0.00,0.00,235.01,261.72,288.24
51.30,684.20,0.00,0.00,236.51,245.06,237.37
412.50,128.90,0.00,500.00,238.01,245.16,268.66
452.00, , , , , ,314.68
481.00,155.50,0.00,0.00,241.02,278.72,348.44
162.20,201.90,0.00,500.00,242.52,250.36,255.58
171.80,152.00,0.00,500.00,244.03,246.85,339.06
Before your DO loop, assign a unique value to the indices array, some value that you know won't occur in the data set. Example:
indices = -99.
DO J=1,30
Read(1,*) indices(J,:)
END DO
The missing values in indices will still have the value -99 after reading the file. You can then count the number of -99s in each column.
The namelist method can skip non-provided values, but that has a very particular format. Otherwise if you want to skip non-provided values and have blanks not interpreted as zero you will have to provide your own additional level of processing. Interpreting blanks as zeros on numerical input is the Fortran way. I think that you basically have to write your own parser. Read the lines into a string, then split them into sub-strings via commas (or blanks too?). If the sub-string is blank leave the value unchanged -- that is what you want? Otherwise use an "internal" read to read the values from the string into the number. Not trivial, but you want to do something non-standard. Look through the string intrinsics provided with Fortran, they will make the processing easier.
try: open(unit=10, file=... blank=blank)
Don't know if it works, but blank="zero" resets your blank spaces to 0... supose my solution will do the opposite ;)
精彩评论