如何使用正则表达式轻松编辑属性数据?


30

我正在为使用QGIS的MSc学生编写教程。其中一项任务要求修改属性数据(如果有兴趣,请参见此处的 pdf文档草稿)。

问题是如何让他们编辑属​​性数据。我知道这个问题以前曾被问过,而且答案曾经很简单:只需使用LibreOffice calc对其进行修改然后保存,确保行顺序和列标题保持不变。我以前曾使用过这种方法,效果很好。

不幸的是,该解决方案不再起作用:将.dbf文件保存在LibreOffice(5.4.2)或OpenOffice(3.4.1)中。Calc从QGIS角度对数据进行加扰(属性表中仅出现随机整数),并且而是创建一个附加的.dbt文件。

因此,要提出一个问题:我如何告诉一班理学硕士课程的学生下周去做?我考虑了以下选项:

  1. 改用R(对我来说很棒,但对学生来说却很可怕)
  2. 将文件编辑为.csv,然后根据时间戳进行合并(很好,但似乎过于复杂,可能会在2小时的实际操作中引入更多错误)
  3. 使用其他程序:我尝试了Gnumeric和Excel,但它们都不很快产生良好的结果。

为了帮助回答这个问题,我创建了一个可复制的示例。在QGIS中打开文件“ points.shp”,观察属性表,然后关闭。在LibreOffice中的属性表“ points.dbf”中编辑几个单元格-保存。在QGIS中重新打开“ points.shp”,并观察加扰的属性表。.zip文件夹中的其他shapefile已被LibreOffice和OpenOffice破坏,以说明该问题对我来说是什么样子。

简而言之,如何最好地解决这个问题?


2
欢迎来到该站点,我想说这是一个非常好的问题,希望我们能找到一些好的解决方案。我认为对于这些学生来说,python
毫无用处

13
直接编辑shapefile的.DBF部分太危险了,以至于不能建议常规使用,并且根本不应该由新手使用-至少在有人关心数据的情况下至少如此。但是,可以使用类似性质的更可靠的解决方案:在shapefile中维护唯一的标识符字段。永远不要编辑它。取而代之的是,将属性保留在关联的表(以GIS可以读取的任何格式)中,并以相同的标识符进行连接。现在,在很大程度上,只要保护标识符字段,就可以自由编辑属性表,而不会失去形状和属性之间的联系。
ub

1
Python解决方案就可以了,只要它们易于实现和理解即可。关于保留标识符号是一个不错的选择-(我的问题中的选项2),而且可能是我的默认答案。但是,希望有一个不涉及其他文件的简单“快速修复”(每个shapefile 5个就足够IMO!)
RobinLovelace 2012年

3
您的意思是,每个shapefile 5个?尝试9!:-)(索引文件可能会累积,具体取决于所使用的GIS。)一旦您需要多个相关文件来维护一组数据(并且shapefile至少需要三个),那么这样做就不会造成任何麻烦。放入其他文件。还在时添加元数据文件。:-)一旦建立了连接,它不会自动发生吗?(不过,我不知道如何将时间戳用于
联接

3
如果您有任何倾斜,向他们介绍数据库,spatiaLite有现场编辑和命令行工具的OSM数据的GUI。然后,您可能需要使用一些SQL,并且可以说您的学生将领先一步。
Scro 2012年

Answers:


18

根据Ryan Garnett的建议,我在QGIS中找到了最简单的答案:

使用regexp_replace

此功能由JürgenFischer于1年前添加到字段计算器中(如此错误报告所示)。我尝试了一段时间以了解如何执行此操作,但是未能搜索“ qgis regex”和其他模糊术语。

需要标准化“名称”列中的所有值可能最好地说明了它的功能。例如,如果我们需要将所有包含模式“ Tesc”的单元格替换为“ Tesco”,并删除“ OSM贡献者经常添加的” Tesco,Infirmary Road”这样的多余信息,则可以使用以下功能:

regexp_replace(“ name”,'Tesc。*','Tesco')

在此处输入图片说明

我猜这是Pythonic正则表达式功能,因为它与我以前使用过的grep有点不同。

我认为需要更多文档(有关QGIS网站的详细信息,只用几句话),因此我将以下页面加为书签,以备将来参考:

该解决方案具有两个优点:

  1. 简单:无需额外的程序或附加组件
  2. 使用(Pythonic?)函数(表示文本的“'”很有趣。警告:“或没有符号失败”)和命令行函数向学生介绍正则表达式的功能。

抱歉回答我自己的问题,并非常感谢其他人引导我走向光明!我希望这个问题线索对面临类似问题的其他人有教育意义。


3
不用担心,回答您自己的问题不是问题。
昏暗

很高兴您找到可以帮助您的东西。感谢您的分享,我知道我会用到的。
瑞安·加内特

1
我问过QGIS开发人员,它是Qt regex qt-project.org/doc/qt-4.8/qregexp.html
wildintellect 2014年

9

这可能是一个愚蠢的答案,因为它可能是研究生的学习目标,但是是否有理由不使用“字段计算器”在QGIS中编辑属性?在早期版本的QGIS(1.7版之前)中,无法直接在QGIS中进行编辑属性。因此需要在OpenOffice等中编辑.DBF文件。

从1.7和1.8开始,您可以直接在字段计算器中编辑属性数据,并且可以执行条件表达式。也有可用的Python属性插件,可以为属性编辑提供其他选项。这可能是一个解决方案,或者是您的教程的一个选择。

作为以前的硕士生和现在的大学员工,我了解此问题,以前在QGIS之外执行此操作的要求,现在了解在QGIS中执行所有属性编辑的功能。如果您愿意,我很乐意为您提供更多帮助。


1
嗨,瑞安,是的,这将是理想的解决方案。它具有搜索和替换属性表中的文本,标准化凌乱的OSM名称的能力,这促使我尝试直接编辑.dbf文件。我宁愿在QGIS中对其进行编辑。将尝试使用Python Attribute插件-可能是解决方案。应该使我正在寻找正则表达式搜索/替换功能的事实变得更清楚。
RobinLovelace 2012年

@ user1694378,您仍然可以澄清您的问题。
昏暗

感谢Underdark鼓励我这样做-更好地反映了我实际想要做的事情。
RobinLovelace 2012年

3

您可以使用LibreOffice的基础来修改dbf文件

  1. 打开基础(获取主菜单)
  2. 选择“连接到现有数据库”,然后选择类型“ dBASE”。
  3. 选择包含您的dbf文件的文件夹。
  4. 根据需要选择最终选项,然后选择“完成”。
  5. 随意命名数据库连接文件(例如“ MyxBasefiles.odb”)并将其保存在某个位置。此后,通过单击此文件访问数据库文件。
  6. 选择左侧面板上的“表”,然后有您的数据文件(称为“表”)。和他们在一起。

您现在可以开始对其进行编辑。希望这对于您的目的已经足够了。

您也可以尝试DBF Explorer,尽管它仅适用于Windows。它确实有搜索和替换。

在此处输入图片说明


1
RK谢谢您的迅速答复:似乎是编辑.dbf文件的可靠且安全的方法。我只是尝试了您所说的内容,很高兴地说它可行。
RobinLovelace 2012年

很高兴知道。不错的课程。:)
RK 2012年

但是...我只是尝试了您所说的内容,很高兴地说它适用于单个单元格。不幸的是,它并不是针对该特定应用程序的100%解决方案,因为由于[bug](lists.freedesktop.org/archives/libreoffice-bugs/2010,OOBase似乎不具有本教程所需的搜索替换功能。-十二月/…)。绝对可以在单个单元上工作:经过测试。因此,这是90%的逐单元编辑解决方案,除非我错过了搜索替换功能。例如,有任何想法如何将所有“ Tesc。*”条目替换为“ Tesco”?
RobinLovelace 2012年


更新了我的答案。
RK 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.