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

什么';这是从gfortran读取.dbf文件的最简单方法,fortran,dbf,gfortran,Fortran,Dbf,Gfortran,我正在使用gfortran,我需要编写一个函数,从与ESRI Shapefile关联的.dbf文件中读取记录。我应该能够阅读的文件可以从互联网上获得 file命令对文件格式的意见是: $ file GGSources_polyline.dbf GGSources_polyline.dbf: \012- DBase 3 data file\012- (119 records) 谢谢你的建议我找到了文件格式的大致描述。看起来有很多不同的类型和大小,这会使事情变得复杂一些。我不知道使用Fortra

我正在使用gfortran,我需要编写一个函数,从与ESRI Shapefile关联的.dbf文件中读取记录。我应该能够阅读的文件可以从互联网上获得

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

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

谢谢你的建议

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

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

我现在也遇到了类似的情况,试图读取一个结构与dBase文件非常相似的文件(即指向不同类型文件区域的不同大小的头),最后使用Python和Numpy来读取该文件。读取包括查找文件中的某个位置,读取一组字节,然后使用
numpy.fromstring
选项将其转换为
real*4
real*8
integer*8
,等等。您可以做到这一点,但是,您可能希望保留您的选项。

您最好的选择是使用大多数linux发行版中提供的,例如,将dbf文件转换为其他文件。您可以使用ogr2ogr将dbf文件的内容转换为CSV文件:

ogr2ogr -f "CSV" output.csv FaultScarps_polyline.shp FaultScarps_polyline
(请注意,您需要包括layername,它对于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(or)访问Shapefile并用C进行处理,将其返回到Fortran主程序。

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


转换为csv ascii并从Fortran读取将起作用。如果要尝试读取其他文件类型,则通过编写一些C函数与C I/O库接口,您可以直接读取文件。

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

后来搬到


它与gfortran 4.1.2或更高版本(F2003 ISO_C_绑定模块)一起使用。

Fortran二进制未格式化文件只有在为顺序访问而不是直接访问打开文件时才具有开始/结束记录(指定记录长度)。