如何读取固定列宽文件,每第3行包含标题

时间:2016-06-17 20:56:38

标签: r fixed-width

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

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_open_fwf包中使用laf取得了一些成功。 但是,当我使用此功能时,我会丢失标题信息或数据,具体取决于我设置固定列宽的位置。

数据按列组织,以便奇数列(第一,第三,第五,第七和第九)是ID号,偶数列是实际数据。

我最终想要的是这样的事情:

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

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

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
    }
  }
}

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