如何使用gsub修复大小写定义的多个空格和虚线?

How to use gsub to fix case-defined multiple spaces and broken lines?

我用pdftools把一些pdf文档转成了txt。这是输出的一部分(还不错)

REPÚBLICA DE CHILE         PADRON ELECTORAL AUDITADO       ELECCIONES PRESIDENCIAL, PARLAMENTARIAS y de CONSEJEROS REGIONALES 2017             REGISTROS:       2.421
SERVICIO ELECTORAL         REGIÓN     : ARICA Y PARINACOTA                                    COMUNA: GENERAL LAGOS                                    PÁGINA 1 de 38
                           PROVINCIA  : PARINACOTA
NOMBRE                                                     C.IDENTIDAD SEXO    DOMICILIO ELECTORAL                             CIRCUNSCRIPCIÓN                   MESA
AGUILERA SIMPERTIGUE JUDITH ALEJANDRA                         13.638.826-6 MUJ PUEBLO DE TACORA S N VISVIRI                    GENERAL LAGOS                        4M
AGUILERA ZENTENO PATRICIA ALEJANDRA                           16.223.938-4 MUJ PUEBLO DE GUACOLLO S N CERCANO A                GENERAL LAGOS                        5M
AGUIRRE CHOQUE MARCOS JULIO                                   15.000.385-7 VAR CIRCUNSCRIPCION
                                                                               CALLE  TORREALBA DE  VISVIRI
                                                                                                 CASA  N° 4 PUEBLO DE VISVIRI  GENERAL LAGOS                        7V

所以我这样做是为了清理它并将其转换为格式化的 tsv:

test = read_lines("file.txt")

test2 = test[!grepl("REP\u00daBLICA",test)]
test2 = test2[!grepl("SERVICIO",test2)]
test2 = test2[!grepl("NOMBRE",test2)]
test2 = test2[!grepl("PROVINCIA",test2)]

test2 = gsub("\.", "", test2)
test2 = gsub("(?<=[\s])\s*|^\s+|\s+$", "", test2, perl=TRUE)

输出为:

ABRIGO PIZARRO PATRICIO ESTEBAN 16024716-9 VAR PUEB ALCERRECA GENERAL LAGOS 5V
ABURTO VELASCO ESTHER MARISOL 13005517-6 MUJ VILLA INDUSTRIAL GENERAL LAGOS 2M
ACEVEDO MONTT SEBASTIAN ANDRES 17829470-9 VAR CALLE RAFAEL TORREALBA N° 3 PUEBLO DE VISVIRI GENERAL LAGOS 3V
ACHILLO BLAS ADOLFO ARTURO 13008044-8 VAR VISURI GENERAL LAGOS 7V

我已经阅读了一些帖子,但我不确定如何实施:

  1. 类似于gsub("(?<=[\s+])[0-9]", "\t", test2, perl=TRUE),这是将多个空格后跟一个数字替换为tab后跟一个数字
  2. 如何将虚线移动到上一行的末尾,例如上面示例中以多个空格开头的第 8 行。

修复 (1) 和 (2) 会 return 这个:

ABRIGO PIZARRO PATRICIO ESTEBAN \t 16024716-9 \t VAR \t PUEB ALCERRECA \t GENERAL LAGOS \t 5V
ABURTO VELASCO ESTHER MARISOL \t 13005517-6 \t MUJ \t VILLA INDUSTRIAL \t GENERAL LAGOS \t 2M

(1) 可以使用"VAR"和"MUJ"作为关键字进行拆分:

x <- "AGUILERA SIMPERTIGUE JUDITH ALEJANDRA                         13.638.826-6 MUJ PUEBLO DE TACORA S N VISVIRI                    GENERAL LAGOS                        4M"
strsplit(x, "\s{2,}|\s(?=\bMUJ\b)|(?<=\bMUJ\b)\s|\s(?=\bVAR\b)|(?<=\bVAR\b)\s", perl = TRUE)

结果是:

[[1]]
[1] "AGUILERA SIMPERTIGUE JUDITH ALEJANDRA" "13.638.826-6"                          "MUJ"                                  
[4] "PUEBLO DE TACORA S N VISVIRI"          "GENERAL LAGOS"                         "4M"

也许不是最优雅的解决方案,但它有效,如果您可以修改数据,您可以使用真正的关键字并确保它们是唯一的。

(2) 一个简单的解决方案是检查行长度并在行太短时向上移动值