如何读取每 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
}
}
}
这只是打印到标准输出,因为没有指定特定的输出。请注意,输出的顺序与您显示的示例不完全相同 - 如果您希望按该顺序输出,则必须先存储输出然后对其进行排序。
我有一个固定列宽的文件,每 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
}
}
}
这只是打印到标准输出,因为没有指定特定的输出。请注意,输出的顺序与您显示的示例不完全相同 - 如果您希望按该顺序输出,则必须先存储输出然后对其进行排序。