如何读取每 3 行 headers 的固定列宽文件

How to read in a fixed column width file with headers every 3rd row

我有一个固定列宽的文件,每 5 行有 headers(包含重要信息)。像这样:

XX ZZ MM
1 12 5 22 9 12 13 11 17 21
2 12 6 22 10 12 14 11 18 21
3 12 7 22 11 12 15 11 19 21
4 12 8 22 12 12 16 11 20 21
AA BB CC
1 12 5 12 9 11 13 21 17 21
2 12 6 22 10 12 14 11 18 21
3 12 7 22 11 12 15 11 19 21
4 12 8 22 12 12 16 11 20 21

首先,我希望能够读入文件。我在 laf 包中对 laf_open_fwf 取得了一些成功。 但是,当我使用此功能时,我会丢失 header 信息或数据,具体取决于我设置固定列宽的位置。

数据按列组织,奇数列(第一、三、五、七、九)为身份证号,偶数列为实际数据。

我希望最终得到的结果如下所示:

XX ZZ MM 1 12
XX ZZ MM 2 12
XX ZZ MM 3 12
XX ZZ MM 4 12
XX ZZ MM 5 22
XX ZZ MM 6 22
XX ZZ MM 7 22
XX ZZ MM 8 22
XX ZZ MM 9 12
XX ZZ MM 10 12
XX ZZ MM 11 12
XX ZZ MM 12 12
XX ZZ MM 13 11
XX ZZ MM 14 11
XX ZZ MM 15 11
XX ZZ MM 16 11
XX ZZ MM 17 21
XX ZZ MM 18 21
XX ZZ MM 19 21
XX ZZ MM 20 21
XX ZZ MM 21 21
AA BB CC 1 12
AA BB CC 2 12
AA BB CC 3 12
AA BB CC 4 12
AA BB CC 5 22
AA BB CC 6 22
AA BB CC 7 22
AA BB CC 8 22
AA BB CC 9 12
AA BB CC 10 12
AA BB CC 11 12
AA BB CC 12 12
AA BB CC 13 11
AA BB CC 14 11
AA BB CC 15 11
AA BB CC 16 11
AA BB CC 17 21
AA BB CC 18 21
AA BB CC 19 21
AA BB CC 20 21
AA BB CC 21 21

感谢您的帮助。

您可以读入文件,遍历行,并测试每一行是否是 header。如果它不是 header 行,则一次打印出我们看到的最新 header 以及两个数据值。它看起来像这样:

text <- readLines('/path/to/file')                   # read in the file
split_text <- strsplit(text, "\s+")                 # split each line on whitespace

for (line in split_text) {                           # iterate through lines
  numeric_line <- suppressWarnings(as.numeric(line)) # try to convert the current line into a vector of numbers
  if (is.na(numeric_line[[1]])) {                    # if it fails, we know we're on a header line
    header <- line
  } else {
    for (i in seq(1, length(line), 2)) {             # otherwise, we're on a data line, so take two numbers at once
      print(c(header, line[[i]], line[[i+1]]))       # and output the latest header with each pair of values
    }
  }
}

这只是打印到标准输出,因为没有指定特定的输出。请注意,输出的顺序与您显示的示例不完全相同 - 如果您希望按该顺序输出,则必须先存储输出然后对其进行排序。