从gfortran读取.dbf文件的最简单方法是什么?

时间:2009-04-15 16:01:19

标签: fortran dbf gfortran

我正在使用gfortran,我需要编写一个函数来读取与ESRI Shapefile关联的.dbf文件中的记录。我应该能够阅读的文件可以从互联网http://diss.rm.ingv.it/diss/DISS_3.0.4.shp.zip

获得

关于文件格式的file命令的意见是:

$ file GGSources_polyline.dbf
GGSources_polyline.dbf: \012- DBase 3 data file\012-  (119 records)

感谢您的建议

4 个答案:

答案 0 :(得分:1)

我找到了文件格式here的粗略描述。看起来整个变量类型和大小都有很多混合,这会使事情变得复杂一些。我不知道使用Fortran尝试读取这些数据是最好的选择,但是如果你必须在这里提供一些提示:

  • 打开文件以直接访问未格式化的I / O. Unformatted意味着您可以直接从文件中读取字节,直接访问不会向记录添加任何填充。
  • 将记录长度设置为字段之间的最小公共长度
  • 使用transfer()功能将内存中的位置解释为特定类型。这将允许您将文件中的二进制数据读入类型integer的变量,但随后分配给real而不进行类型转换。

我现在处于类似的情况,试图读取一个结构与dBase文件非常相似的文件(即不同大小的标题指向不同类型的文件区域),最后使用Python和Numpy读取文件。读取包括seek到文件中的某个位置,读取一堆字节,然后使用numpy.fromstring选项将其转换为real*4real*8,{{1你可以使这个工作,但你可能想保持你的选择。

答案 1 :(得分:1)

最好的办法是将dbf文件转换为其他内容,例如使用OGR tools,在大多数Linux发行版中都可用。您只需使用ogr2​​ogr:

将dbf文件的内容转换为CSV文件
ogr2ogr -f "CSV" output.csv FaultScarps_polyline.shp FaultScarps_polyline

(请注意,您需要包含图层名,对于Shapefile,它与shapefile的名称相同)。 CSV的前3行如下所示:

IDSOURCE,IDSCARP,SOURCENAME,FAULTSCARP,LENGHT,HEIGHT,AVGVOFFSET,MAXVOFFSET,VOFFSETTYP,AVGHOFFSET,MAXHOFFSET,HOFFSETTYP,AGE,NOEVENTS,LENGHTQ,HEIGHTQ,VOFFSETQ,HOFFSETQ,AGEQ,NOEVENTSQ,LENGHTN,HEIGHTN,VOFFSETN,HOFFSETN,AGEN,NOEVENTSN,REFERENCE
ITGG001,          1,Ovindoli-Pezza,Ovindoli-Pezza Fault Piano Pezza,  4.40, 18.00,   9.750,  16.000,          1,   0.000,   0.000,3,             10.000000000000000,3,1,0,1,1,1,1,Based on topographic observations.,Max height in late Pleistocene-Holocene fluvioglacial deposits.,Based on geological survey and refers to late Pleistocene-Holocene deposits.,Based on geological survey.,Based on geological observations.,Refers to Holocene and based on paleoseismology.,Pantosti et al. [1996].
ITGG001,          2,Ovindoli-Pezza,Ovindoli-Pezza  Fault Campo Porcaro,  8.60,  0.00,   8.700,  12.000,          1,   3.045,   4.025,1,             18.000000000000000,3,1,0,1,1,1,1,Based on topographic observations.,,Max offset observed  in the late Pleistocene-Holocene fluvioglacial and moraine deposits.,"Calculated as 35 % of the vertical component, on the basis of literature data.",Based on geological observations.,Refers to Holocene and based on paleoseismology.,Pantosti et al. [1996]

另一种方法是使用OGR(或Shapelib)访问Shapefile并在C中进行处理,将其返回到Fortran主程序。

答案 2 :(得分:0)

你可能很难在Fortran中读取二进制未格式化的文件,这些文件不是从Fortran写入语句编写的,除非你的编译器有一些扩展名。 Fortran二进制无格式文件具有记录开头和记录标记结束。这些标记通常是记录的长度(以字节为单位)。 因此,运行时系统将尝试将文件中的字符解释为记录标记并使其混淆。

转换为csv ascii并从Fortran读取它将起作用。如果您打算尝试读取其他文件类型,那么编写一些C函数来连接到C I / O库应该允许您直接读取文件。

答案 3 :(得分:0)

FortranGIS软件包具有与shapelib库的Fortran绑定,允许直接从Fortran程序编码/解码shapefile和相关的dbf文件:

http://fortrangis.berlios.de/

适用于gfortran 4.1.2或更高版本(F2003 ISO_C_BINDING模块)。